![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Есть хук, перехватывает нажатие клавиш и выводит на экран 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, кнопка да эдит никакого кода. Последний раз редактировалось Tovarisch, 13.03.2010 в 23:04. |