LazActiveX: Internet Explorer und Tastenkombinationen

Rund um die LCL und andere Komponenten
Antworten
LazProgger
Beiträge: 63
Registriert: Di 11. Mär 2014, 00:33

LazActiveX: Internet Explorer und Tastenkombinationen

Beitrag von LazProgger »

Ich habe mit der Beschreibung von der Seite http://wiki.lazarus.freepascal.org/LazActiveX einen ActiveX-Container mit dem Internet Explorer in ein Programm eingebunden.

Das funktioniert alles wunderbar, allerdings gehen leider die Tastenkombinationen wie STRG+C und STRG+V etc nicht in dem Browser.

Im Internet habe ich gefunden, dass zumindest bei Delphi folgendes helfen soll:

Code: Alles auswählen

uses ActiveX;
...
initialization
  OleInitialize(nil);
 
finalization
  OleUninitialize;
end.
 


Allerdings zeigt dies in Lazarus keine Wirkung.. Hat jemand eine Idee, was ich machen kann damit die Tastenkombinationen gehen?

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: LazActiveX: Internet Explorer und Tastenkombinationen

Beitrag von gocher »

http://forum.lazarus.freepascal.org/ind ... ic=19506.0 (komplette Beschreibung)
http://netikka.net/dev/LazBrowserDemo.zip (download link)
Dafür müssen in der Unit1.pas ein paar Zeilen angepasst werden, Achtung 3 Stellen zwischen "// von hier --> " und "// <-- bis hier", anschließend funktioniert Copy, Paste, Cut und Select All,

Code: Alles auswählen

 
// Handle events from keyboard and mouse hooks
procedure TForm1.Timer2Timer(Sender: TObject);
var event: integer;
// von hier -->
  vaIn, vaOut: olevariant;
// <-- bis hier
begin
 if handle_event>0 then
 begin
  event:=handle_event;
  handle_event:=0; //reset
  if event=1 then MenuItem2Click(self); // New tab
  if event=2 then MenuItem3Click(self); // Save Page
  if event=3 then closetab(self); // Close tab
  if event=4 then MenuItem9Click(self); // View source
  if event=5 then setzoompercent(TLazBrowser(form1.PageControl1.ActivePage.Controls[0]), form1.zoompercent[TLazBrowser(form1.PageControl1.ActivePage.Controls[0]).owner.componentindex]+10);
  if event=6 then setzoompercent(TLazBrowser(form1.PageControl1.ActivePage.Controls[0]), form1.zoompercent[TLazBrowser(form1.PageControl1.ActivePage.Controls[0]).owner.componentindex]-10);
  if event=7 then MenuItem7Click(self); // Find..
  if event=8 then
  begin
   updatereg2(ieaddress1.Items[ieaddress1.itemindex]);
   ieaddress1.Items.Delete(ieaddress1.ItemIndex);
  end;
// von hier -->
  if event = 9 then (TLazBrowser(PageControl1.ActivePage.Controls[0]).ComServer as IWebbrowser2).ExecWB (OLECMDID_PASTE, OLECMDEXECOPT_DODEFAULT, vaIn, vaOut);
  if event = 10 then (TLazBrowser(PageControl1.ActivePage.Controls[0]).ComServer as IWebbrowser2).ExecWB (OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT, vaIn, vaOut);
  if event = 11 then (TLazBrowser(PageControl1.ActivePage.Controls[0]).ComServer as IWebbrowser2).ExecWB (OLECMDID_CUT, OLECMDEXECOPT_DODEFAULT, vaIn, vaOut);
  if event = 12 then (TLazBrowser(PageControl1.ActivePage.Controls[0]).ComServer as IWebbrowser2).ExecWB (OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT, vaIn, vaOut);
// <-- bis hier
 end;
 if handle_event=0 then timer2.enabled:=false; // stop timer
end;
 
{ *** mouse and keyboard hooks ***
http://msdn.microsoft.com/en-us/library ... 84(v=vs.85).aspx
functions must return quickly. Work is done in timer2
}

function KeyboardHookProc(Code, wParam, lParam: LongInt): LongInt; stdcall;
 var
  Text: array[0..255] of char;
  msg: TMsg;
  IOIPAO: IOleInPlaceActiveObject;
  Dispatch: IDispatch;
begin
 if (Code<0) then
 begin
  Result:=CallNextHookEx(KBHook, Code, wParam, lParam);
  exit;
 end;
 
 // Exit if widow title is something else..
 GetWindowText(GetForegroundWindow, Text, 256);
 if pos(title1, Text)=0 then
 begin
  Result:=CallNextHookEx(KBHook, Code, wParam, lParam);
  exit;
 end;
 
 // tab key, F5 copy/cut/paste.. why this is required?
 if (wParam=VK_TAB) or
    (wParam=VK_F5) or
    ((GetKeyState(VK_CONTROL)<0) and (wParam = Ord('C'))) or
    ((GetKeyState(VK_CONTROL)<0) and (wParam = Ord('V'))) or
    ((GetKeyState(VK_CONTROL)<0) and (wParam = Ord('X'))) or
    ((GetKeyState(VK_CONTROL)<0) and (wParam = Ord('A'))) then
 begin
  Dispatch:=(TLazBrowser(form1.PageControl1.ActivePage.Controls[0]).comserver as IWebbrowser2).application;
  if (Dispatch<>nil) and (not (TLazBrowser(form1.PageControl1.ActivePage.Controls[0]).comserver as IWebbrowser2).Busy) then
  begin
   Dispatch.QueryInterface(IOleInPlaceActiveObject, IOIPAO);
   if IOIPAO<>nil then
   begin
    if (lParam shr 31)=0 then msg.message:=WM_KEYDOWN else msg.message:=WM_KEYUP;
    msg.wParam:=wParam;
    msg.lParam:=lParam;
    if IOIPAO.TranslateAccelerator(msg)=0 then begin Result:=1; IOIPAO:=nil; exit; end;
    IOIPAO:=nil;
   end;
  end;
 end;
 if (lParam shr 31)=0 then
 begin
  if wParam=VK_F3 then
  begin
   Result:=1; form1.handle_event:=7; form1.timer2.enabled:=true; exit; // Find..
  end;
  if wParam=VK_DELETE then
  begin
   if (form1.Ieaddress1.DroppedDown) and (form1.Ieaddress1.itemindex<>-1) then
   begin
    Result:=1; form1.handle_event:=8; form1.timer2.enabled:=true; exit; // Delete url
   end;
  end;
  if (GetKeyState(VK_CONTROL)<0) then
  begin
   if wParam = Ord('T') then
   begin
    Result:=1; form1.handle_event:=1; form1.timer2.enabled:=true; exit; // New tab
   end;
   if wParam = Ord('S') then
   begin
    Result:=1; form1.handle_event:=2; form1.timer2.enabled:=true; exit; // Save page
   end;
   if wParam = Ord('Q') then
   begin
    Result:=1; form1.handle_event:=3; form1.timer2.enabled:=true; exit; // Close tab
   end;
   if wParam = Ord('U') then
   begin
    Result:=1; form1.handle_event:=4; form1.timer2.enabled:=true; exit; // View source
   end;
   // Zoom percentage
   if (wParam=107) or (wParam=187) then
   begin
    Result:=1; form1.handle_event:=5; form1.timer2.enabled:=true; exit;
   end;
   if (wParam=109) or (wParam=189) then
   begin
    Result:=1; form1.handle_event:=6; form1.timer2.enabled:=true; exit;
   end;
// von hier -->
   if wParam = Ord('V') then
   begin
     Result := 1;
     form1.handle_event := 9;
     form1.timer2.Enabled := True;
     exit; // Paste
   end;
   if wParam = Ord('C') then
   begin
     Result := 1;
     form1.handle_event := 10;
     form1.timer2.Enabled := True;
     exit; // Copy
   end;
   if wParam = Ord('X') then
   begin
     Result := 1;
     form1.handle_event := 11;
     form1.timer2.Enabled := True;
     exit; // Cut
   end;
   if wParam = Ord('A') then
   begin
     Result := 1;
     form1.handle_event := 12;
     form1.timer2.Enabled := True;
     exit; // Select All
   end;
// <-- bis hier
  end;
 end;
 Result:=CallNextHookEx(KBHook, Code, wParam, lParam);
end;
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

LazProgger
Beiträge: 63
Registriert: Di 11. Mär 2014, 00:33

Re: LazActiveX: Internet Explorer und Tastenkombinationen

Beitrag von LazProgger »

Vielen Dank erstmal für die ausführliche Antwort.

Ich hatte irgendwie gehofft dass es einfacher geht. In Delphi sinds ja nur zwei Zeilen und KeyboardHooks sind ja schon recht schwere Geschütze, mal abgesehen von dem Timer der irgendwie nach nicht so einer sauberen Lösung klingt..

Gibts da keine einfachere Lösung? Die normalen Tasten funktionieren ja auch im Browser aus irgendeinem Grund.

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: LazActiveX: Internet Explorer und Tastenkombinationen

Beitrag von gocher »

Eigentlich klingt allein schon das Internet-Explorer OCX nicht so richtig nach einer sauberen Lösung :)
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

LazProgger
Beiträge: 63
Registriert: Di 11. Mär 2014, 00:33

Re: LazActiveX: Internet Explorer und Tastenkombinationen

Beitrag von LazProgger »

gocher hat geschrieben:Eigentlich klingt allein schon das Internet-Explorer OCX nicht so richtig nach einer sauberen Lösung :)


Klar, ich bin auch kein großer Freund vom Internet Explorer, aber das war jetzt die einfachste und schnellste Möglichkeit.

Wenn du eine andere Möglichkeiten kennst ohne gleich einen eigenen Browser neu zu programmieren, immer her damit, ich habe ein offenes Ohr. Voraussetzung ist allerdings das das Programm ohne DLL auskommen muss und der Browser auch JavaScript etc. unterstützen sollte, womit leider alle mir bekannten Möglichkeiten in Lazarus wegfallen und der Internet Explorer übrig bleibt...

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: LazActiveX: Internet Explorer und Tastenkombinationen

Beitrag von gocher »

Also shdocvw.dll und mshtml.dll sind auch DLLs.
Ohne DLLs fällt meinesWissens QT Webkit, GeckoPort, LazActiveX (IE) und LazWebKit aus,
da bleibt eigentlich nur THtmlPort siehe: http://wiki.freepascal.org/THtmlPort.
Das THtmlPort JavaScript unterstützt glaube ich allerdings nicht.

Deshalb bin ich auch bei der schmutzigen Variante gelandet :(
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Antworten