Подтвердить что ты не робот

Почему EnumChildWindows пропускает детей?

Я получаю странное поведение, когда дело доходит до использования метода Windows EnumChildWindows. Кажется, он не подбирает раздел детских окон. Когда я разбираюсь с использованием Spy ++, я могу видеть детей, но когда я выполняю свой код, он не возвращает те, которые я вижу в Spy ++.

Что я вижу в Spy ++ Что я вижу в Spy ++ http://img24.imageshack.us/img24/9264/spyhandles.png

Вот мой код:

public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);

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

    public static List<IntPtr> GetChildWindows(IntPtr parent)
    {
        List<IntPtr> result = new List<IntPtr>();
        GCHandle listHandle = GCHandle.Alloc(result);
        try
        {
            EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
            EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
        }
        finally
        {
            if (listHandle.IsAllocated)
                listHandle.Free();
        }
        return result;
    }

    private static bool EnumWindow(IntPtr handle, IntPtr pointer)
    {
        GCHandle gch = GCHandle.FromIntPtr(pointer);
        List<IntPtr> list = gch.Target as List<IntPtr>;
        if (list == null)
            throw new InvalidCastException("GCHandle Target could not be cast as List<IntPtr>");

        list.Add(handle);            
        return true;
    }

Есть ли причина, по которой выделенная красная часть на скриншоте выше не будет заполнена в моей коллекции (List<IntPtr>) при вызове EnumChildWindows?

4b9b3361

Ответ 1

Doh! Я обнаружил ошибки моих путей. Причина, по которой я получал только половину детей, была связана с тем, что я не ожидал достаточно долго, чтобы окно первоначально загрузилось и создало ВСЕ детей в нем, поэтому я получал только первую половину, которую он создал на время я вызывал свою функцию для получения всех дочерних окон. Поэтому я добавил строку кода для сна перед вызовом EnumChildWindows().

"Windows не вызывает функцию обратного вызова для любых дочерних окон, созданных после вызова EnumChildWindows, но до ее возвращения". - Источник

Вышеприведенная часть информации - это то, что превратило лампочку в мою голову.