none
請問要捕獲 WM_COMMAND,需要使用何種類型的 HOOK RRS feed

  • 問題

  • 您好!!!
            由於 HOOK 有 15 種類型,而我目前想要攔截的是,WM_COMMAND 這種訊息,那我應該要使用哪一種的 HOOK,我指的是 SetWindowHookEx 中的第一個參數應該要設定成什麼?

            另外還有一個小問題,之前璉大在某篇文章給了我 EnableMenuItem 的提示,立即馬上去嘗試 EnableMenuItem,把接龍選單中的某個 MenuItem 給 Grayed,不過它(接龍)立即偵測到,並且恢復,所以我想請問一下,它偵測到是依據什麼類型的訊息阿(WM_XXXXXXXX)?我利用 Spy++ 去觀看,卻沒看到它 menuitem state changed 之類的訊息。我應該要如何得知?因為連訊息可能的長相都不太清楚,感謝萬分。

    2007年10月20日 上午 03:09

解答

所有回覆

  • HI  阿 SIR:

     

    WH_CALLWNDPROC 

    Installs a hook procedure that monitors messages before the system sends them to the destination window procedure. For more information, see the CallWndProc hook procedure.

     

    下面範例給你參考  ︿︿

     

    程式碼區塊

     

    g_hProc = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, g_hInstDLL, dwThreadID);

     

      .

      .

      .

     

     

     

    LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
     CWPSTRUCT *p = (CWPSTRUCT *)lParam;

     // 捕获 WM_COMMAND  訊息

     if (p->message == WM_COMMAND )

      {
        if ( p->wParam ==CM_XXXX) 

          {

            // 加入你的 CODE 

          }
      

      }


      return CallNextHookEx(g_hProc, nCode, wParam, lParam);
    }

     

     

     

     

     

    2007年10月20日 上午 03:45
  • HI,

     

    如果您是要攔截其他程式的WM_COMMAND訊息, 可以參考以下的做法, 不過是VB6的CODE:

    http://vbcity.com/forums/topic.asp?tid=115675

     

     

    tihs

    2007年10月20日 上午 11:52
  • 我想請問 SetWindowHookEx 的第三、四個參數應該要放什麼?我是打算 Hook 在一個 Process 上面。不過我 Hook 會發生 GetLastError() = 5 -> 存取被拒。第三個參數是 HWND?HANDLE?HInstance?

     

    謝謝你的解答 Smile

    2007年10月23日 上午 05:34

  • linly  Sir  :

    第三、四個參數

     HINSTANCE    hMod,              // handle of application instance
     DWORD          dwThreadId     // identity of thread to install hook for

    EX:

    DWORD dwThreadID = GetWindowThreadProcessId(hWin, NULL); 
    g_hProc = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, g_hInstDLL, dwThreadID);





    2007年10月23日 上午 05:54
  • 所以就利用 GetWindowThreadProcessId,第一個參數擺 Process 的 HWND 來取得 dwThreadID 即可,那第三個參數 g_hInstDLL 就擺放 NULL 囉?? 

    2007年10月23日 上午 07:23
  •  

    基本上

     

    捕獲應用程式 都是 寫成 DLL

     

    所以 g_hInstDLL   就是指   DLL 的  HInstance

     

    dwThreadID 是指 你要 捕獲訊息 的那一個視窗之Thread ID    (EX: 你要捕獲 MSN Messager 視窗的訊息 那dwThreadID 就填入 MSN Messager 視窗的 WindowThreadProcessId )

     

     

    2007年10月23日 上午 07:35
  •  

    我搞迷糊了,您指的 DLL 是哪個對象,我寫的 routine 包成 DLL? 我現在是打算 Hook 在 Word 這個 Process 上面。
    2007年10月23日 上午 08:49


  • linly  Sir  :

    如果你是用 delphi 寫的話

    請參閱

    Delphi編程使用HOOK監視Windows

    http://tech.ddvip.com/2006-07/11543502696514.html

    2007年10月23日 上午 08:52