[問題] [delphi] Dll和hook的問題 |
尚未結案
|
sonoma001
一般會員 ![]() ![]() 發表:8 回覆:14 積分:4 註冊:2004-02-25 發送簡訊給我 |
請大家給小弟一些提示吧~~><" 我現在在做熱鍵的hook 但system scope hook須要用dll檔 我有找到了delphi深度歷險的範例
但是我需要在dll檔裡的讀取熱鍵的function 在被熱鍵觸發後回去執行 主程式.exe 檔裡的某個程序 小弟研究了一個晚上還是沒有成功....T_T ...可以提供個範例給我嗎 小弟的程序不需要變數 只需要單純呼叫即可...請幫幫我@@" 我也有試過不用dll改用 hNextHookProc := SetWindowsHookEx(WH_JOURNALRECORD,KeyboardHookHandler,HInstance,0); 但不知為何滑鼠 和鍵盤 會 失效
??? 為何會這樣呢?
|
geniustom
版主 ![]() ![]() ![]() ![]() ![]() 發表:100 回覆:303 積分:260 註冊:2003-01-03 發送簡訊給我 |
sonoma001您好.. 其實一般人會用HOOK的種類有2種..
1...您的程式需要記錄所有鍵盤按過的值..(例如..按鍵精靈)
2...您的程式只需要當使用者執行某個熱鍵時..觸發您程式的某一段程序
(例如..按下ALT+F1觸發您的FORM_CREATE)
第1種因為安全性問題..所以OS線制一定要外掛DLL..才可以攔截到所有的鍵盤事件 不過我看您的需求好像是第二種..所以不用這麼麻煩..
只要使用RegisterHotKey()與UnRegisterHotKey()兩個函數即可...
這兩個函數的意義就是...當您想要用某個組合鍵來當您某個程式的熱鍵..
先向OS註冊是什麼按鍵..當WINDOWS收到符合您熱鍵的鍵盤訊息時..
會告訴您的程式"使用者按了熱鍵了"..所以您直接處理即可..
不用再向第一種方式這麼麻煩..需要攔截跟過濾所有的鍵盤訊息..
關於這兩個函數的使用範例..
可參考
按鍵無效的問題
http://delphi.ktop.com.tw/topic.php?topic_Id=43324 GOOD LUCK
|
sonoma001
一般會員 ![]() ![]() 發表:8 回覆:14 積分:4 註冊:2004-02-25 發送簡訊給我 |
|
geniustom
版主 ![]() ![]() ![]() ![]() ![]() 發表:100 回覆:303 積分:260 註冊:2003-01-03 發送簡訊給我 |
引言: 感謝您的解答 因為我想要在整個windows都可以呼叫那個熱鍵 <--所以囉..用RegisterHotKey就行了..您又沒有要紀錄鍵盤事件 我看遍了ktop 大家一至的做法都是使用dll檔~ <--有這回事嗎?..如果您真的看遍..應該會看到RegisterHotKey 唯一例外的就是只有使用 WH_JOURNALRECORD 但是不曉得為什麼一用這個hook整個系統就停止回應 鍵盤滑鼠orz,只能使用ctrl del alt才能解除 之前有一次沒有發生這個情況...但剛剛又發生了 T_T 我就差熱鍵的部分了 請幫幫忙 又RegisterHotKey()的部份是如何使用呢 問題多了點請 多多包涵 @@"..----------------------------------------- 欄全部鍵盤<---CALL DLL... 熱鍵<---------可由單一程式決定 用很簡單的方法就能完成的東西..為何要繞一大圈呢?? 要看範例..請看 |
geniustom
版主 ![]() ![]() ![]() ![]() ![]() 發表:100 回覆:303 積分:260 註冊:2003-01-03 發送簡訊給我 |
|
sonoma001
一般會員 ![]() ![]() 發表:8 回覆:14 積分:4 註冊:2004-02-25 發送簡訊給我 |
geniustom前輩您好 T_T"
我把這一段放到一個新的application裡 但是執行後 按熱鍵沒有回應?
是我那裡做錯嗎 麻煩您了 procedure TForm1.FormCreate(Sender: TObject);
begin
if GlobalFindAtom('MyHotkey1') = 0 then
begin {Ctrl Alt f1}
id:=GlobalAddAtom('MyHotkey1');
RegisterHotKey(handle,id,MOD_CONTROL MOD_Alt,VK_F1);
end;
end; procedure TForm1.WMHotKey (var Msg : TWMHotKey);
begin
if msg.HotKey = id then
ShowMessage('Ctrl Alt f1');
form1.Visible :=true;
end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnRegisterHotKey(handle,GlobalFindAtom('MyHotkey1'));
GlobalDeleteAtom(GlobalFindAtom('MyHotkey1'));
end;
|
sonoma001
一般會員 ![]() ![]() 發表:8 回覆:14 積分:4 註冊:2004-02-25 發送簡訊給我 |
geniustom前輩您好 T_T"
我把這一段放到一個新的application裡 但是執行後 按熱鍵沒有回應?
是我那裡做錯嗎 麻煩您了 procedure TForm1.FormCreate(Sender: TObject);
begin
if GlobalFindAtom('MyHotkey1') = 0 then
begin {Ctrl + Alt + f1}
id:=GlobalAddAtom('MyHotkey1');
RegisterHotKey(handle,id,MOD_CONTROL+MOD_Alt,VK_F1);
end;
end; procedure TForm1.WMHotKey (var Msg : TWMHotKey);
begin
if msg.HotKey = id then
ShowMessage('Ctrl+Alt+f1');
form1.Visible :=true;
end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnRegisterHotKey(handle,GlobalFindAtom('MyHotkey1'));
GlobalDeleteAtom(GlobalFindAtom('MyHotkey1'));
end;
|
geniustom
版主 ![]() ![]() ![]() ![]() ![]() 發表:100 回覆:303 積分:260 註冊:2003-01-03 發送簡訊給我 |
恩..不錯不錯..只差臨門一角..我來幫幫您吧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |