2012-09-09 56 views
0

我目前正在爲一個應用程序做一個插件,因爲它不處理WM_MBUTTONDOWN消息我決定掛鉤WNDPROC,但似乎另一個插件也掛鉤它並處理此消息(因爲應用程序按字母順序加載插件,有可能我最後沒有掛接WNDPROC,導致另一個插件首先處理消息)。這意味着我必須是最後一個掛鉤WNDPROC才能夠接收這些消息。掛鉤過程最後

那麼,有沒有任何可靠的(不依賴於字母順序等)最後掛鉤程序的方式?

編輯:掛鉤是通過使用SetWindowLong函數更改窗口的DWL_WNDPROC屬性到地址掛鉤過程完成的。然後使用CallWindowProc從掛鉤過程中調用原始的DWL_WNDPROC。對不起,沒有明確這一點!

謝謝, Tuntuni。

+0

沒有我知道的任何方式,而且它似乎從雷蒙德的一個博客似乎沒有設置。 – chris

+0

@chris你能否給我提供該文章的鏈接(或者我誤解了你?)? – Tuntuni

+0

不知道我是否能找到它,但這裏有一個關於[他們如何在Win16中工作](http://blogs.msdn.com/b/oldnewthing/archive/2006/08/09/693280.aspx )。 – chris

回答

1

那麼,在你安裝的窗口proc回調中,你可以通過GetWindowLongPtr來調用當前窗口過程,如果有人改變它,重新安裝你的過程SetWindowLongPtr。當然,這是危險的,至少需要你的窗口過程被保護以避免再次入侵(通常使用靜態計數器)以避免無限遞歸。

此外,您可以嘗試使用由SetWindowsHookEx API函數安裝的系統範圍的鉤子而不是窗口子類別 - WH_MOUSEWH_MOUSE_LL鉤子而不是WH_CALLWNDPROC。它應在調用窗口過程之前調用(在GetMessage上,或者甚至在LL鉤子的鼠標消息發佈上),因此它應在調用任何WH_CALLWNDPROC鉤子之前發生。

+0

我不確定這會工作,因爲應用程序在每個插件之間調用GetMessage和CallWindowProc(當它加載它們時)。還有其他方法可以想到嗎? – Tuntuni

+0

@Tuntuni沒有明白你的觀點。如果其他插件使用'WH_CALLWNDPROC'鉤子,那麼'WH_MOUSE'鉤子總是會被調用BEFORE,忽略實際的鉤子安裝順序。至少它應該根據文件(沒有真正嘗試過)。 – Rost

+0

我忘了解釋鉤子是如何完成的。我非常抱歉。我編輯了這個問題。 – Tuntuni