Laden...

Window Handles hierarchisch auslesen.

Erstellt von dr4g0n76 vor 17 Jahren Letzter Beitrag vor 17 Jahren 5.389 Views
dr4g0n76 Themenstarter:in
2.921 Beiträge seit 2005
vor 17 Jahren
Window Handles hierarchisch auslesen.

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.

49.485 Beiträge seit 2005
vor 17 Jahren

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

dr4g0n76 Themenstarter:in
2.921 Beiträge seit 2005
vor 17 Jahren

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.

871 Beiträge seit 2005
vor 17 Jahren

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

dr4g0n76 Themenstarter:in
2.921 Beiträge seit 2005
vor 17 Jahren

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.

dr4g0n76 Themenstarter:in
2.921 Beiträge seit 2005
vor 17 Jahren

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.