2010-10-07 42 views
1

我寫了一個c#應用程序,它自動化了一個IE實例。我想知道當互聯網瀏覽器獲得焦點時,以及當它失去焦點。我可以在C#中使用窗口鉤子來確定窗口是否獲得或失去焦點嗎?

從SHDocVw.InternetExplorer對象我可以得到它的HWND。從那裏我如何創建一個消息鉤子來接收WM_KILLFOCUS和WM_FOCUS事件(假設這些事件是正確的事件:))?

謝謝大家!

更新:我找到了一種方法,可以在不使用鉤子的情況下完成上述目標(我還沒有完全弄清楚如何在c#中完成),在此question中使用.NET框架。

與此代碼

AutomationFocusChangedEventHandler focusHandler 
     = new AutomationFocusChangedEventHandler(OnFocusChanged); 
    Automation.AddAutomationFocusChangedEventHandler(focusHandler); 

的問題是,它很容易讓一個窗口是前臺窗口,當窗口切換到,因爲它等待特定的UI元素的事件將不會觸發重點關注。 (要測試此功能,您可以使用使用該代碼的功能,並在每次打開新窗口時打印消息,例如MSDN示例TrackFocus,然後單擊瀏覽器。當大多數網頁或空白頁顯示在瀏覽器中的事件不會觸發,直到選中地址欄或其他元素爲止)。如果有修改的方法可能會工作,以便在沒有任何UI元素處於焦點中或每次元素丟失時都可以引發事件焦點(而不是在焦點集中時拋出)。任何人都有關於如何修復上述代碼來解決我的問題的任何想法?

更新2:我剛剛遇到這個(article claims you can only hook to mouse and keyboard from c#)以及這可能意味着我不能使用鉤子爲我想做的事情。

回答

1

有關設置C#鉤子的詳細說明,請訪問:http://support.microsoft.com/kb/318804/en-us?fr=1

+0

謝謝!我是否有權假定按照這些說明並設置鉤子,我將能夠監聽WM_KILLFOCUS和WM_FOCUS以確定該窗口何時處於焦點? – Evan 2010-10-08 04:34:52

+0

嗯,我自己並沒有嘗試過這些代碼,但是我成功地在C#中實現了鉤子。試試看,讓我們知道它是如何發展的。祝你好運! – CesarGon 2010-10-08 09:18:39

+0

好吧,我已經通過你的例子,並更好地理解鉤子 - 至少事件鉤在我的應用程序的窗口。然而,我需要做的並且仍然困擾着,正在爲另一個應用程序創建一個鉤子。要做到這一點,我可以使用SetWindowsHookEx與另一個窗口的句柄和threadid?我一直在尋找,我見過很多人說你需要創建一個單獨的DLL?謝謝!! – Evan 2010-10-08 18:32:29

相關問題