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/windows/desktop/ms644984(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;