如何抓取System Wide Hook |
答題得分者是:ccchen
|
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
各位先進大家好:
小弟要抓取Mouse Hook 但怎麼抓都只抓到自己程式的Mouse Hook, 若程式移到程式外就抓不到, 小弟的做法是若有Mouse Hook 就PostMessage志我的程式, 讓程式中的一個TLabel顯示累加數字, 程式如下, 是否哪裡做錯了. Dll 方面:
function EnableMouseHook(MsgReceiver: HWND): BOOL; export; begin Result := False; if hNextHookProc <> 0 then Exit; hMsgReceiver := MsgReceiver; hNextHookProc := SetWindowsHookEx(WH_Mouse, MouseHookHandler, HInstance, 0); Result := hNextHookProc <> 0; end; // // // function MouseHookHandler(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; export; const _KeyPressMask = $80000000; begin Result := 0; PostMessage(hMsgReceiver, WM_USER, 0, 0); If iCode < 0 Then begin Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam); Exit; end; if wParam = WM_RBUTTONDOWN then begin //PostMessage(hMsgReceiver, WM_USER, wParam, lParam); {Inc(Count); if Count > 5 then begin PostMessage(hMsgReceiver, WM_USER, wParam, lParam); Count := 0; end;} end; end; // // // // AP 方面: procedure OnWMUser(var msg: TMessage); message WM_USER; procedure TForm1.OnWMUser(var msg: TMessage); begin inc(i); Label5.Caption := 'X : ' IntToStr(i); end;感謝不吝賜教
------
我不是高手, 高手是正在銀幕前微笑的人. |
tonyplus
初階會員 發表:22 回覆:97 積分:28 註冊:2002-04-13 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
但怎麼抓都只抓到自己程式的Mouse Hook
我也發現同樣問題, 不過用WH_JOURNALRECORD取代, 倒是可以
以下用WH_JOURNALRECORD一樣可取得所有Window下之MouseDown
var hHook:Integer; function HookProc(iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall; var msg:TEventMsg; begin Result:=0; if iCode < 0 then Result := CallNextHookEx(hHook,iCode,wParam,lParam) else if icode=HC_ACTION then begin msg:=pEventMSG(lParam)^; if msg.message=WM_LBUTTONDOWN then begin form1.Memo1.Lines.add(inttostr(msg.hwnd) ':' inttostr(msg.paramL) '-' inttostr(msg.paramH)); end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin hHook:=SetwindowsHookEx(WH_JOURNALRECORD,hookProc,HInstance,0); end; procedure TForm1.Button2Click(Sender: TObject); begin UnHookWindowsHookEx(hHook); hHook:=0; end; procedure TForm1.FormDestroy(Sender: TObject); begin if hHook <> 0 then begin UnHookWindowsHookEx(hHook); hHook:=0; end; end; |
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
引言: 但怎麼抓都只抓到自己程式的Mouse Hook 我也發現同樣問題, 不過用WH_JOURNALRECORD取代, 倒是可以 以下用WH_JOURNALRECORD一樣可取得所有Window下之MouseDown這真是太好了, 這種寫法果然可以抓到整個系統的動作, 且又不用使用DLL, 感謝前輩的範例~~~var hHook:Integer; function HookProc(iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall; var msg:TEventMsg; begin Result:=0; if iCode < 0 then Result := CallNextHookEx(hHook,iCode,wParam,lParam) else if icode=HC_ACTION then begin msg:=pEventMSG(lParam)^; if msg.message=WM_LBUTTONDOWN then begin form1.Memo1.Lines.add(inttostr(msg.hwnd) ':' inttostr(msg.paramL) '-' inttostr(msg.paramH)); end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin hHook:=SetwindowsHookEx(WH_JOURNALRECORD,hookProc,HInstance,0); end; procedure TForm1.Button2Click(Sender: TObject); begin UnHookWindowsHookEx(hHook); hHook:=0; end; procedure TForm1.FormDestroy(Sender: TObject); begin if hHook <> 0 then begin UnHookWindowsHookEx(hHook); hHook:=0; end; end;
------
我不是高手, 高手是正在銀幕前微笑的人. |
loverlin
一般會員 發表:1 回覆:35 積分:22 註冊:2002-07-15 發送簡訊給我 |
使用 WH_JOURNALRECORD 的話,你抓到的是全系統的,而不是指定的單一程式,而且在使用自製機器人的功能時,也不方便(測試&使用過)
使用 MOUSE & KEY Hook 而收不到傳送的訊息時,最大的問題在於觸發 KEY & Mouse Event 的程式所呼叫的 DLL 中的 hMsgReceiver 跟你建立 Hook 的 DLL 中的 hMsgReceiver 不是同一個值,hMsgReceiver必須存在於一個共享記憶體中,這樣被觸發時,才能將訊息傳給正確的 hMsgReceiver. 使用 Hook 的程式
1.建立共享記憶體
2.將 hMsgReceiver 的值存入共享記憶體 被觸發端
1.第一次被觸發時,開啟共享記憶體取得 hMsgReceiver 的值
2.傳送訊息 kk-boy
------
kk-boy |
danielx2000
一般會員 發表:29 回覆:33 積分:22 註冊:2002-09-02 發送簡訊給我 |
|
loverlin
一般會員 發表:1 回覆:35 積分:22 註冊:2002-07-15 發送簡訊給我 |
引言: 那再請問,若我想把這段程式改成類似遠端遙控的功能時, 經由 hookproc 收即到遙控端的MOUSE動作, 在透過winsock送到被控端的mouse上, 那請問在被控端上,如何 1. 由winsock接收到的資料如何送到搖控端的hookproc message上, 2. disable 搖控端的mouse 功能 這兩個問題,傳送端的部分都有辦法解決,但接收端的部分 我想了好久都無法解決 請知道的人幫幫忙 TKS VERY MUCH.1.用 SendInput 或是 keybord_event & mouse_event 模擬發出硬體訊息. (98之後版本最好是換用 SendInput 啦,不過 *_event 是都有支援啦~ xp 我沒試過) 2.以 pcanywhere 來看,好像沒有鎖被控端的 key & mouse~ so 應該是沒必要吧。 kk-boy
------
kk-boy |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |