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

[問題] [delphi] Dll和hook的問題

尚未結案
sonoma001
一般會員


發表:8
回覆:14
積分:4
註冊:2004-02-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-06 14:57:25 IP:61.231.xxx.xxx 未訂閱
請大家給小弟一些提示吧~~><" 我現在在做熱鍵的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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-06 16:47:06 IP:219.68.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-06 22:47:05 IP:61.231.xxx.xxx 未訂閱
感謝您的解答 因為我想要在整個windows都可以呼叫那個熱鍵 我看遍了ktop 大家一至的做法都是使用dll檔~ 唯一例外的就是只有使用 WH_JOURNALRECORD 但是不曉得為什麼一用這個hook整個系統就停止回應 鍵盤滑鼠orz,只能使用ctrl del alt才能解除 之前有一次沒有發生這個情況...但剛剛又發生了 T_T 我就差熱鍵的部分了 請幫幫忙 又RegisterHotKey()的部份是如何使用呢 問題多了點請 多多包涵 @@"..
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-06 23:41:46 IP:219.68.xxx.xxx 未訂閱
引言: 感謝您的解答 因為我想要在整個windows都可以呼叫那個熱鍵 <--所以囉..用RegisterHotKey就行了..您又沒有要紀錄鍵盤事件 我看遍了ktop 大家一至的做法都是使用dll檔~ <--有這回事嗎?..如果您真的看遍..應該會看到RegisterHotKey 唯一例外的就是只有使用 WH_JOURNALRECORD 但是不曉得為什麼一用這個hook整個系統就停止回應 鍵盤滑鼠orz,只能使用ctrl del alt才能解除 之前有一次沒有發生這個情況...但剛剛又發生了 T_T 我就差熱鍵的部分了 請幫幫忙 又RegisterHotKey()的部份是如何使用呢 問題多了點請 多多包涵 @@"..
----------------------------------------- 欄全部鍵盤<---CALL DLL... 熱鍵<---------可由單一程式決定 用很簡單的方法就能完成的東西..為何要繞一大圈呢?? 要看範例..請看
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-06 23:44:40 IP:219.68.xxx.xxx 未訂閱
補充一下.. http://delphi.ktop.com.tw/topic.php?topic_id=30935 這裡有很清楚的範例..程式也短短的!!加油!!
sonoma001
一般會員


發表:8
回覆:14
積分:4
註冊:2004-02-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-07 00:59:12 IP:61.231.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-07 01:01:28 IP:61.231.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-07 01:31:04 IP:219.68.xxx.xxx 未訂閱
恩..不錯不錯..只差臨門一角..我來幫幫您吧 > > 宣告在 class="code"> unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure WMHotKey(var MSG: TWMHotKey); message WM_HOTKEY; //message WM_HOTKEY;<----我猜您沒加對吧^^ procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; id:integer; implementation {$R *.dfm} 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; end.
系統時間:2024-07-02 12:22:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!