2009-09-30 20 views
2

我們已經實施了一些自定義的工具提示繪圖代碼,在計時器上的Tick事件觸發。每當這個事件觸發時,我們檢查,以確保我們的控制是可見的(this.Visible),是前臺窗口(GetForegroundWindow())。如何防止我的自定義工具提示代碼被繪製,當我的窗口部分被始終在頂部的窗口遮擋?

我們所遇到的問題涉及「總在最前面」窗口類似任務管理器或Process Explorer(當「總在最前面」選項啓用)。由於這些窗口始終位於頂部,有時我們的應用程序被這些窗口遮擋/覆蓋,但我們的工具提示仍會彈出並在頂部窗口頂部繪製。

我試過使用Form.TopMost屬性,但這是不可接受的,因爲如果在任何地方都有一個「always on top」窗口,工具提示就不會出現。在這種情況下,我們的應用程序甚至處於活動狀態,所以我們應該顯示工具提示。

如何檢測/確定是否有一個「總在最前面」覆蓋我的形式在鼠標懸停在區域窗口?我想阻止工具提示顯示「通過」窗口。

回答

3

這聽起來像你輪詢定時器鼠標的位置,然後顯示一個提示。這是錯誤的路要走。你應該做的是檢測鼠標移動消息。如果鼠標移動事件告訴您鼠標位於特定區域,則設置一個計時器,並且如果在計時器觸發時鼠標沒有離開該區域,則顯示工具提示。 (順便說一下,這就是本機Windows工具提示的工作方式,請參閱TrackMouseEvent。)

這可以自動解決您始終在窗口上的問題,因爲如果窗口的一部分被始終在頂部的窗口遮擋,將不會接收該區域的鼠標移動事件,因此您無需檢查鼠標是否真的存在。

如果您已經開始使用您當前的技術,那麼您可以使用WindowFromPoint API函數來確定屏幕上任何給定點處可見的窗口。使用它來確定您的窗口是否位於您計劃顯示工具提示的地方。 (該.Net Framework API map說,淨相當於API函數Form.GetChildAtPoint,但只給出了一個.net形式的孩子,而你需要考慮所有頂層窗口,包括non-.Net窗口。)

相關問題