2009-05-04 8 views
13

Ich baue eine App, die mit einer anderen App mainWindowhandle Informationen über den Fensterzustand sammelt. Ich habe kein Problem, Informationen über untergeordnete Fenster zu sammeln, aber ich kann nicht auf die anderen geöffneten Fenster einer Anwendung oder sogar auf die Menüs zugreifen. Gibt es eine Möglichkeit, alle Fenstergriffe einer Anwendung zu erhalten?Die Fenstergriffe der Anwendung holen

+0

prüfen diese Arbeitslösung aus: http://stackoverflow.com/a/28055461/1274092 –

Antwort

15

Sie könnten tun, was Process.MainWindowHandle scheint zu tun: Verwenden Sie P/Invoke, um die EnumWindows-Funktion aufzurufen, die eine Callback-Methode für jedes Top-Level-Fenster im System aufruft.

Rufen Sie in Ihrem Rückruf GetWindowThreadProcessId, und vergleichen Sie die Prozess-ID des Fensters mit Process.Id; Wenn die Prozess-IDs übereinstimmen, fügen Sie das Fenster-Handle zu einer Liste hinzu.

8

Zunächst müssen Sie das Fensterhandle des Hauptfensters der Anwendung aufrufen.

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

IntPtr hWnd = (IntPtr)FindWindow(windowName, null); 

Dann können Sie diesen Griff verwenden, um alle childwindows zu erhalten:

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam); 

private 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; 
} 
+0

Mez das Problem isn‘ t bekommen kind windows, ich kann das leicht tun, was ich nicht tun kann, ist zu anderen windows neben mainWindow und seine childs ... – user361526

+0

Dies funktioniert für jedes Fenster, auch für Fenster, die nicht zu der eigenen Anwendung gehören. Entschuldigung, wenn ich deine Frage missverstanden habe. – Mez

+0

Woher kommt 'EnumWindowProc'? –

Verwandte Themen