2013-07-17 70 views
1

目前,我正在使用強大的SetWinEventHook()函數來捕獲一些用戶界面的操作,例如從計算機上的程序運行的其他窗口最小化和最大化。爲什麼SetWinEventHook回調需要一個表單?

因此,我通過使用BrendanMcK上this post提供的代碼啓發我和它的工作(我的意思是:當一個事件發生時,調用回調函數),直到行

MessageBox.Show("Something") 

存在。但我不想爲這個程序使用任何窗體或窗口..

some research之後,我想出了這種鉤子需要一個消息循環來允許從其他窗口句柄重定向消息。顯然,使用Application.Run()調用線程should do the trick,但我更喜歡清潔的東西,在C#對象本身。

所以我的問題是:是否有可能創建一個對象的方法內的消息循環?

http://bytes.com/topic/c-sharp/answers/557342-thread-message-loop-c

回答

1

不,功能不需要窗口句柄,無需進行任何「形式」。但MSDN文檔的功能非常明確:

調用SetWinEventHook的客戶端線程必須具有消息循環才能接收事件。

消息循環在希望接收由其他進程或線程從外部生成的通知的任何程序中是通用的。這是producer-consumer problem的常用解決方案。顯然任何GUI應用程序都需要這樣的解決方案,Windows消息是由操作系統生成的。 SetWinEventHook()並沒有不同,可訪問性事件來自其他程序。沒有乾淨的機制來「中斷」一個線程並使其運行其他代碼,導致的重入問題非常難以處理。線程必須合作,它必須閒置並準備好接收通知以安全地處理它。消息循環解決了這個問題。

在方法中抽取消息循環(調用Application.Run)當然是可能的。但請記住,只有在使用Application.ExitThread明確停止循環之後方法纔會返回。因此,通常只有一個適合該調用的好地方,即程序的Main()方法。

使用Winforms或WPF項目模板啓動項目是獲得此權利的一種非常好的方法。您無需實際創建窗口,在調用SetWinEventHook之後調用Application.Run()而無需參數。

+0

完美答案,非常感謝! – Louisbob

相關問題