2009-01-18 23 views
9

我试图根据系统托盘应用程序中的通知图标的点击来切换小窗口的显示。这很容易实现,但是当显示小窗口并且另一个应用程序获得焦点并因此移动到其前面时(z顺序),我希望切换器假定现在隐藏了小窗口,即使它的可见性是仍然设置为可见。否则,单击该图标会将窗口可见性设置为隐藏,即使它已经隐藏在另一个窗口之后。我尝试捕获/覆盖激活和停用方法来跟踪,但点击通知图标总是会导致停用事件先触发。使用焦点/失去焦点的类似方法也不起作用,因为窗口似乎认为它仍然有焦点,即使隐藏在另一个正在使用的应用程序窗口后面。最后,我不得不求助于原生代码和WindowFromPoint方法如下:什么是确定一个窗口是否在WPF中实际可见的最佳方法

using System.Windows.Interop; 
using System.Runtime.InteropServices; 
using System.Drawing; 

[DllImport("user32.dll")] 
public static extern IntPtr WindowFromPoint(Point lpPoint); 

public static bool IsWindowVisible(System.Windows.Window window) { 
    WindowInteropHelper win = new WindowInteropHelper(window); 
    int x = (int)(window.Left + (window.Width/2)); 
    int y = (int)(window.Top + (window.Height/2)); 
    Point p = new Point(x, y); 
    return (win.Handle == WindowFromPoint(p)); 
} 

这用来检查窗口返回在问题比赛窗口的中心坐标表示的窗口。即所讨论的窗口的中心是可见的。

这似乎有点冒失,有没有更好的方法来达到同样的效果?

+0

+1对于一个非常有趣的问题。我找不到更好的方法,所以我用你的方法:-) – Joon 2011-06-05 08:00:04

+1

1.我和Joon在一起。好的解决方案 2.人们可能想要查询的不仅仅是中心(例如窗口角落)。 3.注意不要使用`System.Windows.Point`或你得到一些丑陋的例外 – 2011-10-10 09:22:32

回答

2

你可能不希望依赖,因为是可以改变窗口大小,并主张等,所有的人都扎入辅助功能,其增加更多的复杂因素很多窗口是否被遮挡。

相反,你可能要检查窗户是否已焦点。这是MSN Messenger如何知道是否在任务栏中闪烁橙色;它会触发通知,如果没有焦点,任务栏会闪烁。

相关问题