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

Las*_*sus 11 wpf window z-order visible

我正在尝试根据系统托盘应用程序中的通知图标单击来切换小窗口的显示.这很容易实现,但是当显示小窗口并且另一个应用程序获得焦点并因此在它前面移动时(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));
}
Run Code Online (Sandbox Code Playgroud)

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

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

Sov*_*iut 1

您可能不想依赖窗口是否被遮挡,因为有很多因素可以改变窗口大小、位置等,并且所有这些因素都与辅助功能相关,这会增加更多的复杂性。

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