我正在尝试根据系统托盘应用程序中的通知图标单击来切换小窗口的显示.这很容易实现,但是当显示小窗口并且另一个应用程序获得焦点并因此在它前面移动时(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,有没有更好的方法来实现相同的结果?