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

如何抓取System Wide Hook

答題得分者是:ccchen
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-04 17:54:30 IP:210.58.xxx.xxx 未訂閱
各位先進大家好: 小弟要抓取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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-10-31 16:24:59 IP:211.23.xxx.xxx 未訂閱
小弟也想知道這個主題的答案,所以推一下,請各位能人高手,幫幫忙...謝謝
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-11-01 07:48:11 IP:61.219.xxx.xxx 未訂閱
但怎麼抓都只抓到自己程式的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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-11-01 10:23:05 IP:210.58.xxx.xxx 未訂閱
引言: 但怎麼抓都只抓到自己程式的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;
這真是太好了, 這種寫法果然可以抓到整個系統的動作, 且又不用使用DLL, 感謝前輩的範例~~~
------


我不是高手, 高手是正在銀幕前微笑的人.
loverlin
一般會員


發表:1
回覆:35
積分:22
註冊:2002-07-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-11-01 14:23:12 IP:61.228.xxx.xxx 未訂閱
使用 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-11-08 15:09:13 IP:203.75.xxx.xxx 未訂閱
那再請問,若我想把這段程式改成類似遠端遙控的功能時, 經由 hookproc 收即到遙控端的MOUSE動作, 在透過winsock送到被控端的mouse上, 那請問在被控端上,如何 1. 由winsock接收到的資料如何送到搖控端的hookproc message上, 2. disable 搖控端的mouse 功能 這兩個問題,傳送端的部分都有辦法解決,但接收端的部分 我想了好久都無法解決 請知道的人幫幫忙 TKS VERY MUCH.
loverlin
一般會員


發表:1
回覆:35
積分:22
註冊:2002-07-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-11-11 17:10:20 IP:61.228.xxx.xxx 未訂閱
引言: 那再請問,若我想把這段程式改成類似遠端遙控的功能時, 經由 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
系統時間:2024-11-22 21:18:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!