HOOK 與MouseMove |
答題得分者是:william
|
rose
一般會員 發表:2 回覆:6 積分:1 註冊:2002-03-25 發送簡訊給我 |
看了許多有關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 發送簡訊給我 |
引言: 看了許多有關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 發送簡訊給我 |
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
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 發送簡訊給我 |
|
rose
一般會員 發表:2 回覆:6 積分:1 註冊:2002-03-25 發送簡訊給我 |
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
loverlin
一般會員 發表:1 回覆:35 積分:22 註冊:2002-07-15 發送簡訊給我 |
引言:引言:謝謝 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 發送簡訊給我 |
|
loverlin
一般會員 發表:1 回覆:35 積分:22 註冊:2002-07-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |