2009-02-22 48 views
1

我可以使用Control.Enter和Control.Leave事件來檢測用戶焦點何時進入或離開控件,但這隻適用於每個表單的基礎。我在我的應用程序中使用了多個表單,並且想要跟蹤哪個控件具有用戶焦點,我必須使用表單的「激活」和「禁用」事件來跟蹤哪個表單處於活動狀態,然後跟蹤哪個控件關注於每個表單。如何檢測進入/離開每個應用程序的控制權,而無需訪問控制表單?

我們正在使用DockPanel套件構建客戶端,因此我們無法直接訪問控件的表單。我們不能只將偵聽器添加到控件的頂級窗體中,因爲當用戶停靠或取消面板時,偵聽器會發生更改。但是我們仍然需要將注意力集中在每個應用程序的基礎上。如何在無需訪問控制表單的情況下檢測進入/離開每個應用程序的控制權?

回答

1

你能鉤到Control.GotFocus/Control.LostFocus代替,然後保持全球跟蹤哪些控制當前具有焦點?

將這些事件掛鉤添加到每個控件將是非常單調和容易出錯,因爲您可能會錯過一個感興趣的控件。所以,而不是如何使用Application.AddMessageFilter調用,以獲得應用程序中發生的每個Windows消息的回調。

然後,您可以看到所有WM___SETFOCUSWM_KILLFOCUS調用並記錄當前控件的焦點。請記住使用方便的Control.FromHandle靜態方法從追蹤兩個窗口消息時緩存的窗口句柄中獲取一個很好的.NET控件引用。

+0

不幸的是,WM_SETFOCUS消息並不總是通過消息隊列,所以我不能攔截它。見http://www.pcreview.co.uk/forums/thread-1314811.php – Simon 2009-02-23 10:32:18

相關問題