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.