全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1757
推到 Plurk!
推到 Facebook!

求教如何做dll注入某程式后,按鍵呼出dll內部窗體。鍵盤hook已經失效

尚未結案
kolin.z
一般會員


發表:1
回覆:0
積分:0
註冊:2011-09-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-09-04 17:31:47 IP:221.224.xxx.xxx 訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-09-19 15:39:21 IP:118.170.xxx.xxx 訂閱
你好 :

我的做法是在 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;

參考看看.

系統時間:2017-10-23 8:59:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!