【问题标题】:How to sort Windows by z-index?如何按 z-index 对 Windows 进行排序?
【发布时间】:2019-01-03 21:12:44
【问题描述】:

如果我在Application.Current.Windows 中枚举窗口,我如何知道对于任何两个窗口,哪一个“更接近”(即具有更大的 z-index)?

或者,换句话说,如何按 z-index 对这些窗口进行排序?

【问题讨论】:

    标签: wpf z-index


    【解决方案1】:

    您无法从 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);
    

    它的工作方式是:

    1. 它使用字典来按窗口句柄索引给定窗口,使用的事实是,在 WPF 的 Windows 实现中,Window 的 PresentationSource 始终是 HwndSource。
    2. 它使用 Win32 从上到下扫描所有无父窗口以找到正确的顺序。

    【讨论】:

    • 是的,抱歉,这确实需要非托管代码权限(“完全信任”)。
    • 我会接受这个,因为这是迄今为止唯一的答案。
    • 你能看看我的最新问题吗?我真的很想看看你对这个问题的看法。 stackoverflow.com/questions/3642763/…
    • 我只是想补充一点,这种解释可能并不完全准确。 pInvoke.net 指出 GetNextWindow 是一个宏,我们应该改为调用 GetWindow pinvoke.net/default.aspx/user32/GetNextWindow.html pinvoke.net/default.aspx/user32/GetWindow.html 当我试图在我的 .NET 4.0 WPF 应用程序中实现上述代码时,它在尝试调用 GetNextWindow 时抛出异常,说明它不是一个可用的成员,通过将方法更新为由 pInvoke.net 定义的 GetWindow 可以轻松修复但是其余代码可以完美运行。
    【解决方案2】:

    啊,这真的很有趣:

    [DllImport("user32.dll")]
    static extern IntPtr GetActiveWindow();
    
    public static Window ActiveWindow
    {
        get
        {
            return HwndSource.FromHwnd(GetActiveWindow()).RootVisual as Window;
        }
    }
    

    它将为您提供应用中的活动窗口(通常是最前面的)。

    【讨论】:

    • 我认为这不是他的意思
    • 这不仅不是我的意思,而且还需要完全信任(就像任何 P/Invoke 一样)。它甚至可能是值得的,如果 Window.IsActive 属性不容易实现的话。
    猜你喜欢
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多