12

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

4

1 回答 1

1

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

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

于 2009-01-18T09:02:35.630 回答