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

System mouse Hook的問題!

尚未結案
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-03 13:05:05 IP:61.63.xxx.xxx 未訂閱
想寫一個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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-03 14:28:12 IP:61.66.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-03 16:53:48 IP:61.63.xxx.xxx 未訂閱
引言: 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
anpino你好: >? 我的問題應該是要如何將那段程式碼用
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-04 08:03:51 IP:61.66.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-04 08:13:33 IP:61.66.xxx.xxx 未訂閱
轉碼如下:    
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-03-04 14:22:31 IP:61.63.xxx.xxx 未訂閱
引言: 轉碼如下:
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你好< >: 講錯了啦< >!是 pEventMSG 這個! pEventMSG在compile不會過,是undefined!所以我想問這個是不是在BCB中有其它的東西替代,或是要特別include什麼東西才可以過??? 另外TEventMSG在BCB中是找不到,可是compile會過,證明BCB它可以抓到它,所以暫時don't care!只是這種找不到reference卻又可以用的東東好像很多! 另外 >!
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-03-04 15:59:13 IP:61.66.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-03-04 17:10:07 IP:61.66.xxx.xxx 未訂閱
成了!! BCB執行結果跟delphi碼所執行的相同。    
//---------------------------------------------------------------------------    #include 
#include     #pragma hdrstop    #include "Unit1.h"    //---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;    static HHOOK hHook;
LRESULT CALLBACK hookProc(int nCode, WPARAM wParam, LPARAM lParam);    //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{
        hHook = ::SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)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;
        }
}
//---------------------------------------------------------------------------
LRESULT CALLBACK hookProc(int iCode, WPARAM wParam, LPARAM lParam)
{
  TEventMsg msg;
  if (iCode < 0)
  {
    //必須將消息傳遞到消息鏈的下一個接受單元
    return CallNextHookEx(hHook,iCode,wParam,lParam);
  }
  else if (iCode == HC_ACTION)
  {
    msg = *((TEventMsg*)(lParam));
    /*
    詳見MSDN中 [url="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Hooks/HookReference/HookFunctions/JournalRecordProc.asp"]JournalRecordProc Function[/url] 的code參數說明:        HC_ACTION
    The lParam parameter is a pointer to an EVENTMSG structure 
    containing information about a message removed from the system queue. 
    The hook procedure must record the contents of 
    the structure by copying them to a buffer or file.        */
    if (msg.message == WM_LBUTTONDOWN)
    {
      //此行只是顯示Window Handle及x,y座標
      Form1->Memo1->Lines->Add(IntToStr(msg.hwnd) ':' 
                 IntToStr(msg.paramL) '-' IntToStr(msg.paramH));
    }
  }
  return NULL;
}
//---------------------------------------------------------------------------
------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D Programmers Guide http://anpino.begin.8d8d.com 發表人 - anpino 於 2004/03/04 17:16:34
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-03-04 17:18:14 IP:61.63.xxx.xxx 未訂閱
引言:
引言: 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你好: 我的 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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-03-04 17:27:37 IP:61.66.xxx.xxx 未訂閱
我的code在你這帖上面.. 已經解決 pEventMSG 的問題。 ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-03-08 18:52:20 IP:61.63.xxx.xxx 未訂閱
引言: 我的code在你這帖上面.. 已經解決 pEventMSG 的問題。 ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖>< face="Verdana, Arial, Helvetica"> 嗯,歹勢!俗事纏身,又研究一下後續的東東,所以拖了一下才回應! 研究了直接用<>> >!果然在>>東東!謝謝你啦, >!
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-03-09 09:19:55 IP:61.64.xxx.xxx 未訂閱
【Delphi】【轉貼】通過Delphi建立鍵盤滑鼠動作紀錄與重播 http://delphi.ktop.com.tw/topic.php?topic_id=22389 發表人 - conundrum 於 2004/03/09 09:21:01
系統時間:2024-04-25 18:22:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!