Frage

Ich baue eine App, die eine andere App gegeben Mainwindowhandle es Informationen über den Fensterstatus sammelt. Ich habe kein Problem Informationen über Kinder Fenster zu sammeln, aber ich kann nicht die anderen geöffneten Fenster einer Applikation zuzugreifen oder auch die Menüs. Gibt es eine Möglichkeit, alle Fenstergriffe eine Anwendung zu bekommen?

War es hilfreich?

Lösung

Sie tun können, was Process.MainWindowHandle zu tun scheint: Verwendung P / Invoke der EnumWindows -Funktion, die für jedes Fenster der obersten Ebene in dem System.

eine Callback-Methode aufruft

In Ihrem Rückruf, rufen Sie GetWindowThreadProcessId , und vergleichen Sie die Prozess-ID des Fensters mit Process.Id; wenn der Prozess-IDs entspricht, fügen Sie den Fenstergriff auf eine Liste.

Andere Tipps

Als erstes werden Sie die Window der Anwendung des Hauptfensters bekommen.

 [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 bekommen:

[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;  
}   
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top