2010-01-13 93 views
8

我設置與SetWindowsHookEx一個低級別鼠標鉤子:低級別鼠標和鍵盤鉤子回調在哪個線程中運行?

HANDLE handle = SetWindowsHookEx(WH_MOUSE_LL, 
           &callback, 
           GetModuleHandle(NULL), 
           NULL); 

因爲這是一個低級別的回調,將我自己的進程中執行;沒有執行DLL注入。

現在,我注意到有時(間接)從標準API函數(如GetAncestor,GetWindowRect等)調用回調。看起來這些可能導致一些消息隊列被刷新。

其實,我的問題是三倍......

  1. 當調用的回調?

    是否可以從以內調用任何 API函數?我如何看?

  2. 執行回調的線程是什麼?

    它只能在安裝鉤子的線程上運行,或者系統可以在任何線程上調用它嗎?

  3. 爲什麼首先將鉤子實現爲回調?

    (請問Raymond Chen是否在這裏閒逛?)對於我來說,將鉤子簡單地作爲(發送)消息來實現似乎更加明智,就像幾乎所有其他Windows一樣。對於消息,至少我知道哪些函數會導致待處理的已發送消息被處理(GetMessage,PeekMessage和其他幾個),並且我會知道它們在哪個線程上被處理(首先收到消息的線程) 。

回答

8
  1. 請參閱第3

  2. 這是寫很清楚在documentation

    [...]然而,WH_MOUSE_LL鉤沒有注入到其他進程。相反,上下文切換回安裝鉤子的進程,並在其原始上下文中調用它。然後上下文切換回生成事件的應用程序。 [...] 該鉤子在安裝它的線程的上下文中調用。

  3. 其實這實現這樣的

    [...]呼叫通過發送消息給安裝鉤子的線。因此,安裝該鉤子的線程必須有一個消息循環。

據我所知,當你的鉤子必須名爲Windows在你的線程的消息隊列中提出一個特殊的消息。你在消息泵中的代碼調用Peek/GetMessage,它檢查它是否是特殊消息,如果是,它會調用你的鉤子程序(一些證據here,我從那裏獲取圖像)。 Hook dispatching call stack http://cboard.cprogramming.com/attachments/windows-programming/9323d1253895425-setwindowshookex-lowlevelmouseproc-hook-callback-callstack-png

+2

如果你能原諒我,我會把頭撞在牆上一會兒。非常感謝! – Thomas 2010-01-14 21:18:12

+0

我的問題是「爲什麼他們對WH_MOUSE_LL和WH_MOUSE有不同的行爲?」 (一個需要一個dll,運行在應用程序線程中,一個可以在一個exe文件中,在它自己的線程中)像...這是爲了讓我們更容易,但它只是針對那些特定的事件,呵呵? – rogerdpack 2013-09-10 20:10:31

+0

@rogerdpack:這大多與原始問題無關,您應該發佈您自己的問題。 – 2013-09-10 20:47:48