Mit der untenstehenden Klasse können Windows-Fenster hierarchisch ausgelesen werden, über die Find-Methoden können sogar ganz schnell Fenster-Handles eines bestimmten Programms gefunden werden, z.B.:
Dieser Code-Abschnitt reicht, um ein bestimmtes Fenster finden zu können.
In diesem Fall wird der Button "2" des Windows-Taschenrechners ermittelt.
IntPtr ptr = CDllImports.FindWindow("SciCalc", null);
if (ptr != IntPtr.Zero)
{
CWindowNode node = new CWindowNode(ptr);
bool b = node.Is(WindowStyle.WS_VISIBLE);
List<CWindowNode> aNode = node.Find("Button","2");
}
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
Hallo dr4g0n76,
ich gehe mal davon aus, dass du den Code durch die Veröffentlichung der Community zur Verfügung stellen willst. Deshalb habe ich den Thread in die .NET-Komponentensammlung verschoben.
herbivore
Alles klar, dann mach ich noch ein Testprojekt dazu.
Hier das Projekt dazu:
Über Rückmeldungen würde ich mich sehr freuen.
Code wurde auf Hinweise hin von Egrath aktualisiert.
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
Hallo dr4g0n76,
erstmal danke für das Projekt, das kann man sicherlich mal brauchen!
Hier ein comment:
Bei mir verursachen die beiden Nativen Funktionen "GetWindowTextA" und "GetClassNameA" eine Exception, da der StringBuilder über eine Default Capacity von 16 Zeichen verfügt, du aber 255 Zeichen an die unmanaged Funktion übergibts - untenstehend der überarbeitete code:
private string GetClassName(IntPtr ptrWindow)
{
StringBuilder sbClassName = new StringBuilder( 255 );
CDllImports.GetClassNameA(ptrWindow, sbClassName, 255);
return sbClassName.ToString();
}
private string GetWindowText(IntPtr ptrWindow)
{
StringBuilder sbWindowText = new StringBuilder( 255 );
CDllImports.GetWindowTextA(ptrWindow, sbWindowText, 255);
return sbWindowText.ToString();
}
Grüsse, Egon
egrath's Blog: http://egonrath.eg.funpic.de/wordpress
Schönen herzlichen Dank für den Fehlerhinweis. 🙂
noch besser wäre dann untenstehender Code
StringBuilder sb = new StringBuilder(255);
GetClassname(ptr,sb.Capacity)
bzw. die 255 in eine Variable zu nehmen. Änderung kommt sofort.
OK, Code wurde oben aktualisiert.
Noch eine Änderung: Prozesse mit eingefügt und davon geladene DLLs.
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
z.B. ist sowas mit dieser Klasse ganz einfach:
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.