c# - 在给定 HWND 的情况下如何获取窗口的子窗口?

标签 c# windows winapi children

我有给定窗口的句柄。如何枚举它的子窗口?

最佳答案

Here你有一个可行的解决方案:

public class WindowHandleInfo
{
    private delegate bool EnumWindowProc(IntPtr hwnd, IntPtr lParam);

    [DllImport("user32")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr lParam);

    private IntPtr _MainHandle;

    public WindowHandleInfo(IntPtr handle)
    {
        this._MainHandle = handle;
    }

    public List<IntPtr> GetAllChildHandles()
    {
        List<IntPtr> childHandles = new List<IntPtr>();

        GCHandle gcChildhandlesList = GCHandle.Alloc(childHandles);
        IntPtr pointerChildHandlesList = GCHandle.ToIntPtr(gcChildhandlesList);

        try
        {
            EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
            EnumChildWindows(this._MainHandle, childProc, pointerChildHandlesList);
        }
        finally
        {
            gcChildhandlesList.Free();
        }

        return childHandles;
    }

    private bool EnumWindow(IntPtr hWnd, IntPtr lParam)
    {
        GCHandle gcChildhandlesList = GCHandle.FromIntPtr(lParam);

        if (gcChildhandlesList == null || gcChildhandlesList.Target == null)
        {
            return false;
        }

        List<IntPtr> childHandles = gcChildhandlesList.Target as List<IntPtr>;
        childHandles.Add(hWnd);

        return true;
    }
}

食用方法:

class Program
{
    [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
    public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

    static void Main(string[] args)
    {
        Process[] anotherApps = Process.GetProcessesByName("AnotherApp");
        if (anotherApps.Length == 0) return;
        if (anotherApps[0] != null)
        {
            var allChildWindows = new WindowHandleInfo(anotherApps[0].MainWindowHandle).GetAllChildHandles();
        }
    }
}

关于c# - 在给定 HWND 的情况下如何获取窗口的子窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42037134/

相关文章:

c# - 将字符串转换为十进制? (可为空的十进制)通过扩展方法

c# - 键盘处理程序中的输入/返回键出现问题

python - sqlite3 3.5.7 与 3.6.21 括号问题

c++ - 在 win32 上将 wav 文件解码为 raw

c++ - 如何从Visual C++中获取具体的windows服务可执行文件路径

c# - 异步委托(delegate)和异步方法有什么区别?

c# - 如何覆盖 List.Add 方法?

python - VirtualEnv系统找不到指定的路径: '...Python3.6\\DLL'

windows - Powershell形成全窗玻璃透明度

winapi - 错误 D8016 : '/ZI' and '/clr' command-line options are incompatible