Почему EnumChildWindows пропускает детей? - PullRequest
10 голосов
/ 10 августа 2011

Я получаю странное поведение, когда дело доходит до использования метода Windows API 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

1 Ответ

8 голосов
/ 11 августа 2011

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

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

Приведенная выше информация - это то, что зажгло лампочку в моей голове.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...