Есть хук, перехватывает нажатие клавиш и выводит на экран PopUpMenu, хук в dll, но есть форма из который я его запускаю. Так вот меню видно только если рабочая форма в фокусе, причем реакция на сочетание клавиш есть, проверял на showmessage все как надо отображает, а если гдето позади то меню не видно, но хук зависает в ожидании ответа от меню, тоесть оно гдето есть. Из мсдн я понял что TrackPopupMenu просто както активирует меню, а само меню привязано к окну, причем там же написано что вызов меню обязательно должен происходить при активном окне. Может ктото подскажет есть ли вариант вызвать таки это меню, если создаю я его в длл.
Пока попробую передать WM_DRAWITEM в рабочее окно.
Вот код:
Код:
library PasteHook;
uses
Windows, Messages, ActnPopup,clipbrd, Menus, SysUtils, dialogs;
{$R *.res}
type
blank = class
procedure OnPopClick(Sender: TObject);
constructor Create;
destructor Destroy; override;
end;
var
SysHook : HHook = 0;
State: Boolean = False;
PasteMenu: TPopUPMenu;
Blank1: Blank;
HW: HWND;
procedure Blank.OnPopClick(Sender: TObject);
var
str: string;
begin
str:=copy((Sender as Tmenuitem).Caption,2,255);
Clipboard.asText:=str;
SendMessage(HW,WM_PAste,0,0);
HW:=0;
end;
constructor blank.Create;
begin
end;
destructor Blank.Destroy;
begin
inherited;
end;
{==============================================================================}
Function FilterFunc(Code:integer; wParam, lParam:DWORD):DWORD; stdcall;
var
MousePos:TPoint;
begin
if code = HC_ACTION then
begin
if (wParam = 112) and ((GetKeyState(VK_Control) and 32768) = 32768) then
begin
HW:= GetFocus;
GetCursorPos(MousePos);
PasteMenu.Popup(MousePos.X,Mousepos.Y);
Result:=CallNextHookEx(SysHook, Code, wParam, lParam);
end;
end
else
begin
Result:=CallNextHookEx(SysHook, Code, wParam, lParam);
end;
end;
{==============================================================================}
procedure AccHook();
begin
if State = False then
begin
SysHook := SetWindowsHookEx(WH_KeyBoard,@FilterFunc, HInstance, 0);
State:= True;
// OnPasteEvent:=Event;
Blank1:= Blank.Create;
PasteMenu:= TPopUpMEnu.Create(nil);
PasteMenu.Items.Add(NewItem('123', 0,False,True, Blank1.OnPopClick,0,'name'));
end
else
begin
UnhookWindowsHookEx(SysHook) ;
Blank1.Destroy;
SysHook := 0;
State := False;
end;
end;
{==============================================================================}
exports AccHook index 1;
begin
end.
Dll гружу статичекси из формы там вызывается AccHook, кнопка да эдит никакого кода.