2011-06-19 53 views
2

假設我有一個有效的hWnd到活動窗口(例如,它使用'GetForegroundWindow'或FindWindow檢索),我可以從另一個應用程序註冊到此hWnd的windows消息,當然?有沒有用於此的Win32 API或內置的C#方法?使用'hwnd'註冊窗口消息

示例:在我的控制檯應用程序中,我有一個hWnd到'記事本'窗口(在後臺運行)。我能否以某種方式註冊指示「記事本」窗口已移動,更改大小,最小化,關閉等的消息?

感謝,

埃拉德

回答

2

你必須注入DLL擁有該窗口中的過程。使用SetWindowsHookEx(),WH_CALLWNDPROC掛鉤。您不能使用C#語言編寫這樣的DLL,該進程不會有CLR初始化並準備好運行您的代碼。本機代碼是必需的。檢查this project

2

如果你只是需要知道它移動或關閉,然後檢查出SetWinEventHook。你必須爲此編寫一個P/Invoke包裝器,因爲在.Net API中沒有等價物。您可以在不需要注入DLL的情況下使用它(使用WINEVENT_OUTOFCONTEXT 標誌),因此可以將所有內容保存在C#中(並且還避免了在單獨的DLL和主進程之間進行通信的麻煩)。

您可能需要事件EVENT_OBJECT_LOCATIONCHANGE和EVENT_OBJECT_DESTROY。請注意,您可以在您正在收聽的線索上獲得所有HWND的所有信息,因此您需要在回撥中通過HWND進行過濾。

請注意,當您使用WINEVENT_OUTOFCONTEXT時,您自己的代碼需要在調用SetWinEventHook的線程上運行消息循環。此外,您收到的通知不會立即發送,但會稍微延遲(與PostMessage相似),但對於您的目的而言,這可能仍然足夠快,以至於您可以避免執行進程內掛接。

您可以使用Windows SDK的一部分的Accessible Event Watcher應用程序(AccEvent)在開始編寫代碼之前查看記事本中可用的消息。