首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在windows中获取z顺序?

如何在windows中获取z顺序?
EN

Stack Overflow用户
提问于 2009-05-05 15:59:21
回答 4查看 40.3K关注 0票数 30

我正在制作一个应用程序,其中我与每个正在运行的应用程序进行交互。现在,我需要一种方法来获得窗口的z顺序。例如,如果Firefox和记事本在运行,我需要知道哪一个在前面。

有什么想法吗?除了对每个应用程序的主窗口执行此操作外,我还需要对其子窗口和姊妹窗口(属于同一进程的窗口)执行此操作。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-05 16:03:38

可以使用GetTopWindow函数搜索父窗口的所有子窗口,并返回z顺序最高的子窗口的句柄。GetNextWindow函数以z顺序检索下一个或上一个窗口的句柄。

GetTopWindow:http://msdn.microsoft.com/en-us/library/ms633514(VS.85).aspx

GetNextWindow:http://msdn.microsoft.com/en-us/library/ms633509(VS.85).aspx

票数 14
EN

Stack Overflow用户

发布于 2012-03-02 13:11:32

简明扼要:

代码语言:javascript
复制
int GetZOrder(IntPtr hWnd)
{
    var z = 0;
    for (var h = hWnd; h != IntPtr.Zero; h = GetWindow(h, GW.HWNDPREV)) z++;
    return z;
}

如果您需要更高的可靠性:

代码语言:javascript
复制
/// <summary>
/// Gets the z-order for one or more windows atomically with respect to each other. In Windows, smaller z-order is higher. If the window is not top level, the z order is returned as -1. 
/// </summary>
int[] GetZOrder(params IntPtr[] hWnds)
{
    var z = new int[hWnds.Length];
    for (var i = 0; i < hWnds.Length; i++) z[i] = -1;

    var index = 0;
    var numRemaining = hWnds.Length;
    EnumWindows((wnd, param) =>
    {
        var searchIndex = Array.IndexOf(hWnds, wnd);
        if (searchIndex != -1)
        {
            z[searchIndex] = index;
            numRemaining--;
            if (numRemaining == 0) return false;
        }
        index++;
        return true;
    }, IntPtr.Zero);

    return z;
}

(根据GetWindow上的备注部分,EnumChildWindows比在循环中调用GetWindow更安全,因为您的GetWindow循环对外部更改不是原子的。根据EnumChildWindows的参数部分,使用空的父级调用等同于EnumWindows。)

然后,您可以在参数数组中发送每个要比较的窗口,以便可以同时检索它们的z顺序,而不是为每个窗口单独调用EnumWindows,这也不是原子的,也不是安全的。

票数 11
EN

Stack Overflow用户

发布于 2016-09-14 20:40:01

下面是我的C#解决方案:该函数返回给定HWND的同级中的zIndex,从0开始表示最低的zOrder。

代码语言:javascript
复制
using System;
using System.Runtime.InteropServices;

namespace Win32
{
    public static class HwndHelper
    {
        [DllImport("user32.dll")]
        private static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);

        public static bool GetWindowZOrder(IntPtr hwnd, out int zOrder)
        {
            const uint GW_HWNDPREV = 3;
            const uint GW_HWNDLAST = 1;

            var lowestHwnd = GetWindow(hwnd, GW_HWNDLAST);

            var z = 0;
            var hwndTmp = lowestHwnd;
            while (hwndTmp != IntPtr.Zero)
            {
                if (hwnd == hwndTmp)
                {
                    zOrder = z;
                    return true;
                }

                hwndTmp = GetWindow(hwndTmp, GW_HWNDPREV);
                z++;
            }

            zOrder = int.MinValue;
            return false;
        }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/825595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档