Entwickler-Ecke

Internet / Netzwerk - TWebBrowser und Tastatureingaben zb für Falsh spiele


Magic2001 - Mi 21.01.09 14:22
Titel: TWebBrowser und Tastatureingaben zb für Falsh spiele
Habe mit einen kleinen Browser selbst programmiert und bin auch zufrieden damit. Heute musste ich aber mit entsetzen feststellen das es im TwebBrowser scheinbar nicht möglich ist die Tasten zu benutzen. Zb um Flash Spiele zu spielen.

Weis von euch jemand wie ich es hinbekomme das im TwebBrowser auch die Steuerungstasten (pfeile) usw. funktionieren?


Manfred - Mi 28.01.09 12:05

Hi!
Du benötigst einen MessageHandler, der die Tastatureingaben abfängt und an den WebBrowser weiterleitet.
Z.B. so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean);
const
  DialogKeys: set of Byte = [VK_LEFT, VK_RIGHT, VK_BACK, VK_UP, VK_DOWN,
    $30..$39$41..$42$44..$55$57$59..$5A];
var
  iOIPAO: IOleInPlaceActiveObject;
  Dispatch: IDispatch;
begin
  { exit if we don't get back a webbrowser object }
  if (WebBrowser1 = nilthen
  begin
    Handled := System.False;
    Exit;
  end;

  Handled := (IsDialogMessage(WebBrowser1.Handle, Msg) = System.True);

  if (Handled) and (not WebBrowser1.Busy) then
  begin
    if FOleInPlaceActiveObject = nil then
    begin
      Dispatch := WebBrowser1.Application ; // oder auch DefaultDispatch;
      if Dispatch <> nil then begin
        Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);
        if iOIPAO <> nil then
          FOleInPlaceActiveObject := iOIPAO;
      end;
    end;

    if FOleInPlaceActiveObject <> nil then
      if ((Msg.message = WM_KEYDOWN) (* or (Msg.message = WM_KEYUP) *) ) and
        (Msg.wParam in DialogKeys) then
        // nothing - do not pass on the DialogKeys
      else
        FOleInPlaceActiveObject.TranslateAccelerator(Msg);
  end;
end;

Um den Handler anzumelden:

Delphi-Quelltext
1:
  Application.OnMessage := MsgHandler;                    


Magic2001 - Do 29.01.09 12:55

da kann er das nicht finden: FOleInPlaceActiveObject (undefinierter bezeichner)


GTA-Place - Do 29.01.09 18:52

Und darauf hin hättest du nach Suche bei Google FOLEINPLACEACTIVEOBJECT suchen können und hättest die komplette Lösung mit Deklaration von FOleInPlaceActiveObject hier gefunden:
http://www.swissdelphicenter.ch/de/showcode.php?id=1055


Magic2001 - Do 29.01.09 22:10

Danke.