pinvoke icon indicating copy to clipboard operation
pinvoke copied to clipboard

User32 EnumChildWindows

Open ikappas opened this issue 4 years ago • 0 comments

Thank you for your efforts!

The ability to enumerate the child windows that belong to the specified parent window is missing

documentation: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-enumchildwindows

example:

        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);
      
        public IReadOnlyList<IntPtr> GetChildHandles(IntPtr parentHandle)
        {
            var childHandles = new List<IntPtr>();

            var gcChildHandlesList = GCHandle.Alloc(childHandles);
            var pointerChildHandlesList = GCHandle.ToIntPtr(gcChildHandlesList);

            try
            {
                var childProc = new EnumWindowProc(EnumWindow);
                EnumChildWindows(parentHandle, childProc, pointerChildHandlesList);
            }
            finally
            {
                gcChildHandlesList.Free();
            }

            return childHandles.AsReadOnly();
        }

        private static bool EnumWindow(IntPtr hWnd, IntPtr lParam)
        {
            var gcChildHandlesList = GCHandle.FromIntPtr(lParam);

            if (gcChildHandlesList.Target is List<IntPtr> childHandles)
            {
                childHandles.Add(hWnd);
                return true;
            }

            return false;
        }

ikappas avatar Dec 22 '20 16:12 ikappas