System mouse Hook的問題! |
尚未結案
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
想寫一個mouse Hook來追綜mouse在整個system中的動作,查了很多站上的文章,例如這篇就有講到:
http://delphi.ktop.com.tw/topic.php?topic_id=21686 可是其中一些程式碼實在是轉不成BCB的:
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 //此行只是顯示Window Handle及x,y座標 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;嗯,紅色那行是重點! 1. 請問這行怎麼轉builder的(有達觀者要整個function轉的那更感謝了!) >! |
anpino
版主 發表:31 回覆:477 積分:231 註冊:2003-01-02 發送簡訊給我 |
m8815010 您好: msg:=pEventMSG(lParam)^; 在BCB中應該是這樣: msg= *(pEventMSG(lParam)); ps. 我已經快要成為Delphi.K.Top的code轉換員了...XD||||| -------------------------------
數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D
Programmers Guide
http://anpino.begin.8d8d.com 發表人 - anpino 於 2004/03/03 14:31:08
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: m8815010 您好: msg:=pEventMSG(lParam)^; 在BCB中應該是這樣: msg= *(pEventMSG(lParam)); ps. 我已經快要成為Delphi.K.Top的code轉換員了...XD||||| ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D Programmers Guide http://anpino.begin.8d8d.com 發表人 - anpino 於 2004/03/03 14:31:08anpino你好: >? 我的問題應該是要如何將那段程式碼用 |
anpino
版主 發表:31 回覆:477 積分:231 註冊:2003-01-02 發送簡訊給我 |
引言: anpino你好: >? 我的問題應該是要如何將那段程式碼用>>< face="Verdana, Arial, Helvetica"> TEventMSG 是一個data type 沒錯, 但是我在 BCB help 中找不到其定義。 msg:=pEventMSG(lParam)^;中pEventMSG回傳TEventMSG*, (Delphi 中 "^" 是指標) 而msg不是指標,所以要用*(pEventMSG(lParam))將值轉給msg。 ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖 |
anpino
版主 發表:31 回覆:477 積分:231 註冊:2003-01-02 發送簡訊給我 |
轉碼如下:
int hHook; LRESULT __stdcall HookProc(int iCode ,wParam wParam ,lParam lParam) { TEventMsg msg; Result=0; if (iCode < 0) { //必須將消息傳遞到消息鏈的下一個接受單元 Result = CallNextHookEx(hHook,iCode,wParam,lParam); } else if (icode == HC_ACTION) { msg = *(pEventMSG(lParam)); if (msg.message == WM_LBUTTONDOWN) { //此行只是顯示Window Handle及x,y座標 form1->Memo1->Lines->add(inttostr(msg.hwnd) ':' inttostr(msg.paramL) '-' inttostr(msg.paramH)); } } } void __fastcall TForm1::Button1Click(TObject Sender) { hHook = SetwindowsHookEx(WH_JOURNALRECORD,hookProc,HInstance,0); } void __fastcall TForm1::Button2Click(TObject Sender) { UnHookWindowsHookEx(hHook); hHook = 0; } void __fastcall TForm1::FormDestroy(TObject Sender) { if (hHook != 0) { UnHookWindowsHookEx(hHook); hHook = 0; } }------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D Programmers Guide http://anpino.begin.8d8d.com 發表人 - anpino 於 2004/03/04 08:17:58 |
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 轉碼如下:anpino你好< >: 講錯了啦< >!是 pEventMSG 這個! pEventMSG在compile不會過,是undefined!所以我想問這個是不是在BCB中有其它的東西替代,或是要特別include什麼東西才可以過??? 另外TEventMSG在BCB中是找不到,可是compile會過,證明BCB它可以抓到它,所以暫時don't care!只是這種找不到reference卻又可以用的東東好像很多! 另外 >!int hHook; LRESULT __stdcall HookProc(int iCode ,wParam wParam ,lParam lParam) { TEventMsg msg; Result=0; if (iCode < 0) { //必須將消息傳遞到消息鏈的下一個接受單元 Result = CallNextHookEx(hHook,iCode,wParam,lParam); } else if (icode == HC_ACTION) { msg = *(pEventMSG(lParam)); if (msg.message == WM_LBUTTONDOWN) { //此行只是顯示Window Handle及x,y座標 form1->Memo1->Lines->add(inttostr(msg.hwnd) ':' inttostr(msg.paramL) '-' inttostr(msg.paramH)); } } } void __fastcall TForm1::Button1Click(TObject Sender) { hHook = SetwindowsHookEx(WH_JOURNALRECORD,hookProc,HInstance,0); } void __fastcall TForm1::Button2Click(TObject Sender) { UnHookWindowsHookEx(hHook); hHook = 0; } void __fastcall TForm1::FormDestroy(TObject Sender) { if (hHook != 0) { UnHookWindowsHookEx(hHook); hHook = 0; } }------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D Programmers Guide http://anpino.begin.8d8d.com 發表人 - anpino 於 2004/03/04 08:17:58 |
anpino
版主 發表:31 回覆:477 積分:231 註冊:2003-01-02 發送簡訊給我 |
引言: anpino你好< >: 講錯了啦< >!是 pEventMSG 這個! pEventMSG在compile不會過,是undefined!所以我想問這個是不是在BCB中有其它的東西替代,或是要特別include什麼東西才可以過??? 另外TEventMSG在BCB中是找不到,可是compile會過,證明BCB它可以抓到它,所以暫時don't care!只是這種找不到reference卻又可以用的東東好像很多! 另外 >! >>< face="Verdana, Arial, Helvetica"> 原來是pEventMSG阿... 前面都是白寫的...(吐血.....) 我用bcb 試看看。 請稍後... ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D Programmers Guide http://anpino.begin.8d8d.com 發表人 - anpino 於 2004/03/04 16:31:29 |
anpino
版主 發表:31 回覆:477 積分:231 註冊:2003-01-02 發送簡訊給我 |
成了!!
BCB執行結果跟delphi碼所執行的相同。
//--------------------------------------------------------------------------- #include------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D Programmers Guide http://anpino.begin.8d8d.com 發表人 - anpino 於 2004/03/04 17:16:34 |
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言:引言: anpino你好< >: 講錯了啦< >!是 pEventMSG 這個! pEventMSG在compile不會過,是undefined!所以我想問這個是不是在BCB中有其它的東西替代,或是要特別include什麼東西才可以過??? 另外TEventMSG在BCB中是找不到,可是compile會過,證明BCB它可以抓到它,所以暫時don't care!只是這種找不到reference卻又可以用的東東好像很多! 另外 >! >>< face="Verdana, Arial, Helvetica"> 原來是pEventMSG阿... 前面都是白寫的...(吐血.....) 我用bcb 試看看。 請稍後... ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D Programmers Guide http://anpino.begin.8d8d.com 發表人 - anpino 於 2004/03/04 16:31:29anpino你好: 我的 class="code"> TForm1 *Form1; HHOOK hMouseHook; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- LRESULT CALLBACK MouseHook(int iCode,WPARAM wParam,LPARAM lParam) { if (iCode>=0) { if (iCode==HC_ACTION) { MOUSEHOOKSTRUCT* ms; ms=(MOUSEHOOKSTRUCT*)lParam; MSG msg; PeekMessage(&msg,NULL,0,0,PM_NOREMOVE); if (msg.message==WM_MOUSEMOVE) Form1->Memo1->Lines->Add(IntToStr((LONG)msg.hwnd) ":" IntToStr(msg.pt.x) "-" IntToStr(msg.pt.y)); } return 0; } return CallNextHookEx(hMouseHook,iCode,wParam,lParam); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { hMouseHook=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)MouseHook,HInstance,0); if (!hMouseHook) ShowMessage("Wrong to Hook!"); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender,TCloseAction &Action) { UnhookWindowsHookEx(hMouseHook); } //--------------------------------------------------------------------------- 嗯,就這樣!紅色部份是剛try的,可以show出"本"隻ap滑鼠移動的記錄及移動到視窗的hwnd值! MouseProc的lParam參數是一個MOUSEHOOKSTRUCT結構,內面的資訊直接應足夠! |
anpino
版主 發表:31 回覆:477 積分:231 註冊:2003-01-02 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
|
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |