【发布时间】:2019-01-03 21:12:44
【问题描述】:
如果我在Application.Current.Windows 中枚举窗口,我如何知道对于任何两个窗口,哪一个“更接近”(即具有更大的 z-index)?
或者,换句话说,如何按 z-index 对这些窗口进行排序?
【问题讨论】:
如果我在Application.Current.Windows 中枚举窗口,我如何知道对于任何两个窗口,哪一个“更接近”(即具有更大的 z-index)?
或者,换句话说,如何按 z-index 对这些窗口进行排序?
【问题讨论】:
您无法从 WPF 获取 Window 的 Z 顺序信息,因此您必须求助于 Win32。
这样的事情应该可以解决问题:
var topToBottom = SortWindowsTopToBottom(Application.Current.Windows.OfType<Window>());
...
public IEnumerable<Window> SortWindowsTopToBottom(IEnumerable<Window> unsorted)
{
var byHandle = unsorted.ToDictionary(win =>
((HwndSource)PresentationSource.FromVisual(win)).Handle);
for(IntPtr hWnd = GetTopWindow(IntPtr.Zero); hWnd!=IntPtr.Zero; hWnd = GetWindow(hWnd, GW_HWNDNEXT)
if(byHandle.ContainsKey(hWnd))
yield return byHandle[hWnd];
}
const uint GW_HWNDNEXT = 2;
[DllImport("User32")] static extern IntPtr GetTopWindow(IntPtr hWnd);
[DllImport("User32")] static extern IntPtr GetWindow(IntPtr hWnd, uint wCmd);
它的工作方式是:
【讨论】:
啊,这真的很有趣:
[DllImport("user32.dll")]
static extern IntPtr GetActiveWindow();
public static Window ActiveWindow
{
get
{
return HwndSource.FromHwnd(GetActiveWindow()).RootVisual as Window;
}
}
它将为您提供应用中的活动窗口(通常是最前面的)。
【讨论】:
Window.IsActive 属性不容易实现的话。