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

HOOK 與MouseMove

答題得分者是:william
rose
一般會員


發表:2
回覆:6
積分:1
註冊:2002-03-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-24 10:59:23 IP:202.39.xxx.xxx 未訂閱
看了許多有關Hook的文章,也試作了一個程式,...無論Mouse Move 到任何地方,都可傳回訊息回App ,不限只在APP上,而是任何地方, 可是試作的結果,只要離開APP的範圍就偵測不到Mouse Move ,不知那裏出問題 ...很悟卒!!.< >< >. 我試作了一個Remote Hook的DLL 程式碼如下 ***DLL unit********************************************************************************** library HookDLL; uses SysUtils, Classes, MHKPROC in 'MHKPROC.pas'; {$R *.res} exports EnableMouseHook, DisableMouseHook; begin hNextHookProc := 0; // 以下這兩列, 旨在確定 DLL UnLoad 時, 確定將 HOOK 解除 procSaveExit := ExitProc; ExitProc := @MouseHookExit;; end. //============================================================================================ unit MHKPROC; interface uses Windows, Messages; var hNextHookProc: HHook; procSaveExit: Pointer; hMsgReceiver: THandle; FormHandle: HWND; function MouseProc(iCode:Integer;wP:wParam;lP:lParam):LRESULT;stdcall; function EnableMouseHook(MsgReceiver: THandle; HForm: HWND) : BOOL; export; function DisableMouseHook: BOOL; export; procedure MouseHookExit; far; implementation function MouseProc(iCode:Integer;wP:wParam;lP:lParam):LRESULT;stdcall; begin try if (iCode >= 0) then begin if iCode =HC_ACTION then Begin if (wP = wm_MouseMove) or (wP = wm_NCMouseMove) then Begin SendMessage(FormHandle, WM_USER,wp, lp); end; Result := 0; End Else Result := CallNextHookEx(hNextHookProc, iCode, wp, lp); except Result := 0; end; end; function EnableMouseHook(MsgReceiver: THandle; HForm: HWND): BOOL; export; Var dwVcThreadId:DWORD; begin Result := False; if hNextHookProc <> 0 then Exit; FormHandle := HForm; hMsgReceiver := MsgReceiver; // 掛上 WH_KEYBOARD 這型的 HOOK, 同時, 傳回值必須保留下 // 來, 免得 HOOK 呼叫鏈結斷掉 hNextHookProc := SetWindowsHookEx(WH_MOUSE,@MouseProc, HInstance,0); Result := hNextHookProc <> 0; end; function DisableMouseHook: BOOL; export; begin if hNextHookProc <> 0 then begin UnhookWindowshookEx(hNextHookProc); // 解除 Keyboard Hook hNextHookProc := 0; end; Result := hNextHookProc = 0; end; procedure MouseHookExit; begin // 如果忘了解除 HOOK, 自動代理解除的動作 if hNextHookProc <> 0 then DisableMouseHook; ExitProc := procSaveExit; end; end. AP主程式 ** Main Unit**************************************************************************** unit Unit3; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm3 = class(TForm) Button1: TButton; Button2: TButton; Label1: TLabel; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } procedure OnWMUser(var msg: TMessage); message WM_USER; //edited by shieh public { Public declarations } end; var Form3: TForm3; hook:hhook; lib:dword; implementation {$R *.DFM} function EnableMouseHook(MsgReceiver: THandle; HForm: HWND):Bool; external 'HookDLL.dll'; //edited by shieh function DisableMouseHook: BOOL; external 'HookDLL.dll'; //edited by shieh procedure TForm3.Button1Click(Sender: TObject); var adrhook:tfnhookproc; begin EnableMouseHook(HInstance, self.Handle); end; procedure TForm3.Button2Click(Sender: TObject); begin DisableMouseHook; end; procedure TForm3.OnWMUser(var msg: TMessage); Var pMSru:^MOUSEHOOKSTRUCT; begin pMSru:=Pointer(msg.lParam); Label1.Caption :='X:=' IntTOStr(pMSru.pt.X); Label2.Caption :='Y:=' IntTOStr(pMSru.pt.Y); end; end.
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-24 14:43:05 IP:61.231.xxx.xxx 未訂閱
引言: 看了許多有關Hook的文章,也試作了一個程式,...無論Mouse Move 到任何地方,都可傳回訊息回App ,不限只在APP上,而是任何地方, 可是試作的結果,只要離開APP的範圍就偵測不到Mouse Move ,不知那裏出問題 ...很悟卒!!.< >< >.
我是用 BCB ,試用的結果也是一樣,參考: http://delphi.ktop.com.tw/topic.php?topic_id=29185 只要在 HookAPI 內加上 Form1 ,到別的地方再回到 AP 就不行... 但只要不加上 >沒空更新的網頁... href="http://big5.to/吃軟也吃硬">http://big5.to/吃軟也吃硬 http://coolsite.to/ushells 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
rose
一般會員


發表:2
回覆:6
積分:1
註冊:2002-03-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-24 15:03:18 IP:202.39.xxx.xxx 未訂閱
我試的結果,是好像無法做到 System Hook(Remote Hook), SetWindowsHookEx(WH_MOUSE,@MouseProc, HInstance,0-->表攔截系統中所有thread之訊息); 因為mouse 一離開Form1 就無法觸發MouseProc,回到 Form1內才會觸發MouseProc,那表示無法攔截系統中的Mouse Message
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-24 15:21:34 IP:147.8.xxx.xxx 未訂閱
I think you cannot set a system wide mouse hook  class="code">function MouseProc(iCode:Integer;wP:wParam;lP:lParam):LRESULT;stdcall; begin try if (iCode >= 0) then begin if iCode =HC_ACTION then Begin with PEventMsg(lp)^ do if message=WM_MOUSEMOVE then SendMessage(FormHandle, WM_USER, paramL, paramH); end; Result := 0; End Else Result := CallNextHookEx(hNextHookProc, iCode, wp, lp); except Result := 0; end; end; procedure TForm3.OnWMUser(var msg: TMessage); begin Label1.Caption :='X:=' IntTOStr(msg.WParam); Label2.Caption :='Y:=' IntTOStr(msg.LParam); end;
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-24 15:24:45 IP:147.8.xxx.xxx 未訂閱
rose
一般會員


發表:2
回覆:6
積分:1
註冊:2002-03-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-24 15:56:53 IP:202.39.xxx.xxx 未訂閱
謝謝 william ,我一直認為用SetWindowsHookEx(WH_MOUSE...)郤沒有想到用 SetWindowsHookEx(WH_JOURNALRECORD...),但有點不解,WH_MOUSE不也是System Hook..WHy?
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-24 16:15:20 IP:147.8.xxx.xxx 未訂閱
引言:謝謝 william ,我一直認為用SetWindowsHookEx(WH_MOUSE...)郤沒有想到用 SetWindowsHookEx(WH_JOURNALRECORD...),但有點不解,WH_MOUSE不也是System Hook..WHy?
Only the evil Gates knows
loverlin
一般會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-24 18:13:17 IP:61.228.xxx.xxx 未訂閱
引言:
引言:謝謝 william ,我一直認為用SetWindowsHookEx(WH_MOUSE...)郤沒有想到用 SetWindowsHookEx(WH_JOURNALRECORD...),但有點不解,WH_MOUSE不也是System Hook..WHy?
Only the evil Gates knows >< face="Verdana, Arial, Helvetica"> 寫的也許不是很藝術,請大家看看就好,也讓大家了解一下,用 Delphi 寫為何會有問題 unit UnitMouseHook; interface uses Windows, Messages, UnitMouseDefs; procedure DestroyMouseHook; stdcall; function CreateMouseHook(hMain : THandle;dwMsgID : DWORD) : PMouseMsgArray; stdcall; var dwMainProcessID : DWORD; hMainHandle : THandle; hMapHandle : THandle; pMouseArray : PMouseMsgArray; bLeftButton : Boolean; bMiddleButton : Boolean; bRightButton : Boolean; implementation uses Dialogs; Const MOUSE_HOOK_NAME = 'MOUSE HOOK MAPPING NAME'; function MyMouseHook(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall; var pMsg : PMouseHookStruct; begin Result := 0; if dwMainProcessID = GetCurrentProcessID then begin if pMouseArray <> nil then Result := CallNextHookEx(pMouseArray^.hMouseHook ,code,wparam,lparam); Exit; end; if pMouseArray = nil then begin bLeftButton := False; bMiddleButton := False; bRightButton := False; CreateMouseHook(0,0); end else if pMouseArray^.hMain = 0 then DestroyMouseHook; if pMouseArray <> nil then begin with pMouseArray^.mouseArray[ pMouseArray^.nPos ] do begin case wparam of WM_LBUTTONDOWN,WM_NCLBUTTONDOWN : bLeftButton := True; WM_LBUTTONUP,WM_NCLBUTTONUP : bLeftButton := False; WM_MBUTTONDOWN,WM_NCMBUTTONDOWN : bMiddleButton := True; WM_MBUTTONUP,WM_NCMBUTTONUP : bMiddleButton := False; WM_RBUTTONDOWN,WM_NCRBUTTONDOWN : bRightButton := True; WM_RBUTTONUP,WM_NCRBUTTONUP : bRightButton := True; // WM_MOUSEMOVE,WM_NCMOUSEMOVE : end; Buttons[ 0 ] := bLeftButton; Buttons[ 1 ] := bMiddleButton; Buttons[ 2 ] := bRightButton; pMsg := PMouseHookStruct(lparam); nScreenPos.x := pMsg^.pt.x; nScreenPos.y := pMsg^.pt.y; nWindowPos.x := nScreenPos.x; nWindowPos.y := nScreenPos.y; hwnd := pMsg^.hwnd; ScreenToClient(hwnd,nWindowPos); dwProcessID := GetCurrentProcessID; dwThreadID := GetCurrentThreadId; hThread := GetCurrentThread; hProcess := GetCurrentProcess; dwTickCount := GetTickCount; end; PostMessage(pMouseArray^.hMain,pMouseArray^.dwMsgID,pMouseArray^.nPos,0); pMouseArray^.nPos := pMouseArray^.nPos 1; if pMouseArray^.nPos > High(pMouseArray^.mouseArray) then pMouseArray^.nPos := Low(pMouseArray^.mouseArray); Result := CallNextHookEx(pMouseArray^.hMouseHook ,code,wparam,lparam); end; end; procedure DestroyMouseHook; stdcall; begin if Assigned(pMouseArray) = True then begin if hMainHandle <> pMouseArray^.hMain then pMouseArray^.hMain := 0; UnhookWindowsHookEx(pMouseArray^.hMouseHook); UnmapViewOfFile(pMouseArray); end; pMouseArray := nil; if hMapHandle <> 0 then CloseHandle(hMapHandle); hMapHandle := 0; end; function CreateMouseHook(hMain : THandle;dwMsgID : DWORD) : PMouseMsgArray; stdcall; begin Result := nil; DestroyMouseHook; if hMain <> 0 then begin hMapHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TMouseMsgArray), MOUSE_HOOK_NAME); end else begin hMapHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS,True,MOUSE_HOOK_NAME); end; if hMapHandle = 0 then begin DestroyMouseHook; Exit; end; pMouseArray := MapViewOfFile(hMapHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TMouseMsgArray) ); if pMouseArray = nil then begin DestroyMouseHook; Exit; end; hMainHandle := hMain; if hMain <> 0 then begin pMouseArray^.hMouseHook := SetWindowsHookEx(WH_MOUSE,MyMouseHook,hInstance,0); if pMouseArray^.hMouseHook = 0 then begin DestroyMouseHook; Exit; end; pMouseArray^.hMain := hMain; dwMainProcessID := GetCurrentProcessID; pMouseArray^.dwMsgID := dwMsgID; pMouseArray^.nPos := 0; end; Result := pMouseArray; end; end. kk-boy
------
kk-boy
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-25 09:23:28 IP:147.8.xxx.xxx 未訂閱
Thanks loverlin ,
loverlin
一般會員


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-04-25 14:05:51 IP:61.228.xxx.xxx 未訂閱
引言: Thanks loverlin , >< face="Verdana, Arial, Helvetica"> WH_JOURNALRECORD 比較適合用來做機器人吧~配合~ 如果要用來做熱鍵比較不適合 kk-boy
------
kk-boy
系統時間:2024-05-05 19:54:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!