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

标签 wpf window visible z-order

我试图根据点击系统托盘应用程序中的通知图标来切换小窗口的显示。这很容易实现,但是当显示小窗口并且另一个应用程序获得焦点并因此移动到它前面时(z 顺序)我希望切换假设小窗口现在是隐藏的,即使它的可见性是仍然设置为可见。否则,单击该图标会将窗口可见性设置为隐藏,即使它已经隐藏在另一个后面。我已经 try catch /覆盖 activate 和 deactive 方法以保持跟踪,但单击通知图标将始终首先触发 deactive 事件。使用焦点/失去焦点的类似方法也不起作用,因为窗口似乎认为它仍然具有焦点,即使隐藏在另一个正在使用的应用程序窗口后面。最后,我不得不求助于 native 代码和 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,有没有更好的方法来实现相同的结果?

最佳答案

您可能不想依赖窗口是否被阻挡,因为有许多因素可以改变窗口大小、位置等,并且所有这些因素都与可访问性功能相关联,从而增加了更多的复杂性。

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

关于wpf - 确定窗口在 WPF 中是否实际可见的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/454792/

相关文章:

wpf - 在 MVVM 中,在 ViewModel 中 Hook 模型项的事件会导致内存泄漏吗?

css - 如何确保边框自动调整到 react 中的窗口大小

javascript - 我可以以某种方式使用目标 =""——还是必须使用 javascript 来满足这个要求?

methods - JavaFX:ScrollPane 方法 getChildren() 不可见

javascript - 在javascript php中隐藏可见的div并显示另一个div?

wpf - 在代码中创建上下文菜单

c# - 强制重新评估 ICommand.CanExecute

c# - 当我将 visible 正确设置为 true 时,如何防止我的 C# winforms 应用程序窃取焦点?

WPF 组合框自动完成/智能感知区分大小写

wpf - WPF 窗口关闭后会发生什么?