确定窗口是否在WPF中实际可见的最佳方法是什么

时间:2009-01-18 07:58:13

标签: wpf window visible z-order

我正在尝试根据系统托盘应用中点击通知图标来切换小窗口的显示。这很容易实现,但是当显示小窗口并且另一个应用程序获得焦点并因此在它前面移动时(z顺序)我希望切换假设现在隐藏了小窗口,即使它的可见性是仍然可见。否则,单击该图标会将windows visiblity设置为隐藏,即使它已隐藏在另一个后面。我已尝试捕获/覆盖激活和非活动方法以保持跟踪,但单击通知图标将始终导致deactive事件首先触发。使用焦点/丢失焦点的类似方法也不起作用,因为窗口似乎认为即使隐藏在活动使用中的另一个应用程序窗口后面仍然具有焦点。最后,我不得不求助于本机代码和WindowFromPoint方法,如下所示:

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));
}

这将检查在相关窗口中心坐标处返回的窗口是否与所述窗口匹配。即所见窗口的中心是可见的。

这看起来有点hacky,有没有更好的方法来实现相同的结果?

1 个答案:

答案 0 :(得分:2)

您可能不想依赖窗口是否受阻,因为有许多因素可能会改变窗口大小,位置等等,并且所有这些因素都会影响可访问性功能,从而增加了复杂性。

相反,您可能想要检查窗口是否具有焦点。这就是MSN Messenger知道是否在任务栏中闪现橙色的方式;它会触发通知,如果它没有焦点,任务栏会闪烁。