求教如何做dll注入某程式后,按鍵呼出dll內部窗體。鍵盤hook已經失效 |
尚未結案
|
kolin.z
一般會員 ![]() ![]() 發表:1 回覆:0 積分:0 註冊:2011-09-04 發送簡訊給我 |
dll dpr中通過線程方式創建一個非模態窗體。請問如何用按鍵 比如home按鍵控制該窗體的呼出、隱藏。
procedure ThreadCreateWindows;stdcall; begin myfrm:=Tmyfrm.Create(nil); try myfrm.Showmodal; finally FreeAndNil(myfrm); end; end; function MainApplicationHandle: HWND; var MainModule: HMODULE; CurrentPID: DWORD; WindowsPID: DWORD; begin MainModule := GetModuleHandle(nil); CurrentPID := GetCurrentProcessID(); Result := 0; while True do begin Result := FindWindowEx(0, Result, 'TApplication', nil); if (Result = 0) then Exit; // 未找到 GetWindowThreadProcessID(Result, WindowsPID); if (WindowsPID = CurrentPID) and (HMODULE(GetWindowLong(Result, GWL_HINSTANCE)) = MainModule) then Exit; // 找到!! end; end; 可行方式可能有。在dpr或form unit中創建一線程或者time來獲取按鍵信息,對窗體經行消息控制。小弟對win32不精通,求教這個方式的寫法,或其他可行的方法。dpr中按鍵鍵盤hook方式以被屏蔽,失效了。 |
Mickey
版主 ![]() ![]() ![]() ![]() ![]() 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
你好 :
我的做法是在 DLL Project 中, 用 TDataModule Hook Window Message 方式, 如下 TAddInDM = class(TDataModule) procedure DataModuleCreate(Sender: TObject); procedure DataModuleDestroy(Sender: TObject); function AddInMsgHooker(var Msg: TMessage): Boolean; private { Private declarations } public { Public declarations } end; ... procedure TAddInDM.DataModuleCreate(Sender: TObject); begin Application.HookMainWindow(AddInDM.AddInMsgHooker); end; procedure TAddInDM.DataModuleDestroy(Sender: TObject); begin Application.UnHookMainWindow(AddInMsgHooker); end; function TAddInDM.AddInMsgHooker(var Msg: TMessage): Boolean; begin case Msg.Msg of CM_APPKEYDOWN: begin // Msg.Result := SendMessage(Application.ActiveFormHandle, Msg.Msg, Msg.WParam, Msg.LParam) end; end; end; 參考看看. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |