2009-06-18 116 views
1

我在一個監視鼠標手勢的DLL中設置了全局鼠標鉤子。WH_MOUSE爲什麼不是全局鉤子?

一切都很完美,但是爲WH_MOUSE_LL設置了一個鉤子,它是一個低級鉤子,不​​需要在外部注入DLL中。

一旦我切換 - 更合適的人會說 - WH_MOUSE鼠標鉤,一切都崩潰了。一旦我在我的主應用程序(安裝鉤子的應用程序)之外單擊,鉤子就會損壞 - :: UnhookWindowsHookEx將失敗。

我只找到this guy saying at experts exchange: 「沒辦法,至少是Windows XP下的+ SVP2 WH_MOUSE不會走出去,你 必須使用WH_MOUSE_LL代替」

我正確設置了鉤子:在使用共享數據段的DLL中,發佈並不從掛鉤過程發送消息。

這爲什麼改變了?爲什麼沒有記錄?任何人遇到這個?謝謝!

BTW:我已經反向工程了一下流行StrokeIt應用程序,它使用WH_GETMESSAGE和WH_MOUSE掛鉤的組合,仍然適用於XP/Vista的...

+0

必須在自動化應用程序的某個位置進行鼠標掛鉤。 Godspeed;) – 2009-06-18 21:55:55

回答

0

它的新聞,我認爲全球WH_MOUSE鉤不再支持,因爲我有幾個應用程序使用它,他們繼續在XP,Vista和Windows 7上工作。

你是如何設置鉤子的?你應該可以做SetWindowsHookEx(WH_MOUSE,my_mouse_callback,g_hinstance,NULL)。

我唯一能想到的就是回調函數花費的時間太長,在這種情況下,Windows可能會刪除掛鉤,或者它沒有正確調用CallNextHookEx。

0

不知道這是否會作爲評論更好,但在這裏: 我相信根據MSDN WH_MOUSE支持在線程級別或全局。

正如你指出的那樣,有很多應用程序在使用它。

所以我的猜測是你的具體實現全局WH_MOUSE有一個問題需要調試和修復。當你說「鉤子被破壞」時,究竟發生了什麼?掛鉤的應用程序崩潰了嗎?你可以附加一個調試器到你期望的鼠標事件的應用程序,並檢查你的鉤子真的崩潰了嗎?