2011-12-20 338 views
1

我在我的應用程序中使用一個窗口掛鉤來確定是否重新調整了其他應用程序的大小。然後根據其他應用程序的新大小採取一些行動。SetWindowsHook支持32位和64位應用程序

這在純32位環境和純64位環境(鉤子dll編譯爲64位和32位,分別與MSDN文檔中一樣)中工作正常。

但是,這是問題所在。由於Windows 64位操作系統的32位和64位應用程序混合,如果我啓動64位版本的應用程序,我無法監控32位應用程序,反之亦然。

有沒有什麼好的方法來做到這一點。它可以是一個完全不同的機制。

+0

你使用的是什麼樣的鉤子? – 2011-12-20 12:54:48

+0

WH_CALLWNDPROCRET ... – Saibal 2011-12-20 12:58:18

+5

改爲使用可訪問性鉤子。 – 2011-12-20 13:56:25

回答

1

不幸的是,您只能將32位DLL注入32位進程,將64位DLL注入64位進程。這意味着您將需要2個版本的DLL。最重要的是,SetWindowsHookEx()必須從同一系列的可移植可執行文件中調用(也就是說,必須從32位代碼調用32位進程調用SetWindowsHookEx(),類似地,調用64位進程)。

鑑於您的應用程序是64位的,您必須啓動32位程序的一個實例並設置鉤子。您可能希望將其中的一個作爲child,通知parent您感興趣的事件何時已被困住。

從文檔:

SetWindowsHookEx函數可以用來注入一個DLL到另一個進程。 A 32位DLL無法注入到64位進程中,並且64位DLL 無法注入到32位進程中。如果應用程序需要在其他進程中使用鉤子,則要求32位應用程序調用SetWindowsHookEx將32位DLL注入到32位 進程中,並且64位應用程序調用SetWindowsHookEx以注入 將64位DLL轉換爲64位進程。 32位和64位DLL必須有 不同的名稱。

+0

謝謝!這就是我要去的方式......我希望有一個更優雅的解決方案。 – Saibal 2011-12-20 14:15:57