10 Stimmen

Warum überspringt EnumChildWindows Kinder?

Ich bekomme ein seltsames Verhalten, wenn es um die Verwendung der Windows-API-Methode EnumChildWindows geht. Es scheint, dass ein Abschnitt von Kindfenstern nicht erfasst wird. Wenn ich mit Spy++ weiter nach unten bohre, kann ich die Kinder sehen, aber wenn ich meinen Code ausführe, gibt er nicht diejenigen zurück, die ich in Spy++ sehe.

Was ich in Spy++ sehe: Was ich in Spy++ sehe http://img24.imageshack.us/img24/9264/spyhandles.png

Hier ist mein Code:

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 GetChildWindows(IntPtr parent)
    {
        List result = new List();
        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 list = gch.Target as List;
        if (list == null)
            throw new InvalidCastException("GCHandle Target konnte nicht als List umgewandelt werden");

        list.Add(handle);            
        return true;
    }

Gibt es einen Grund, warum der im obigen Screenshot markierte rote Abschnitt nicht in meine Sammlung (List) aufgenommen wird, wenn ich EnumChildWindows aufrufe?

0 Stimmen

Ich habe diesen Code in meiner FindWindowsByClassAndTitle() Funktion implementiert und er findet die Fenster ungefähr 30 Millionen Mal schneller als der Code, den ich zuvor verwendet habe.

8voto

Dekryptid Punkte 1032

Doh! Ich habe die Fehler meiner Wege entdeckt. Der Grund, warum ich nur die Hälfte der Kinder bekommen habe, lag daran, dass ich nicht lange genug gewartet habe, bis das Fenster initial geladen und ALLE Kinder darin erstellt hat. Daher habe ich nur die erste Hälfte erhalten, die es zum Zeitpunkt meines Funktionsaufrufs erstellt hat, um alle Kinderfenster zu erhalten. Also habe ich eine Zeile Code hinzugefügt, um vor dem Aufruf von EnumChildWindows() zu schlafen.

"Windows ruft die Rückruffunktion für keine Kindfenster auf, die erstellt wurden, nachdem EnumChildWindows aufgerufen wurde, aber bevor es zurückkehrt." - Quelle

Das oben zitierte Stück Information ist das, was bei mir im Kopf den Lichtschalter umgelegt hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X