Fenster + Unterfenster auflisten

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Fenster + Unterfenster auflisten

    Hallo,
    ich versuche gerade Spy++ nachzubilden, sprich alle Fenster und deren Unterfenster anzuzeigen, jedoch ist mein Ergebnis komplett anders, meine Funktionen:

    VB.NET-Quellcode

    1. Private Declare Function GetLength Lib "user32.dll" Alias "SendMessageA" (ByVal handle As IntPtr, ByVal uMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    2. Private Declare Function GetString Lib "user32.dll" Alias "SendMessageA" (ByVal handle As IntPtr, ByVal uMsg As Integer, ByVal wParam As Integer, ByVal lParam As StringBuilder) As Integer
    3. Private Declare Function EnumChildWindows Lib "user32.dll" (ByVal window As IntPtr, ByVal callback As EnumWindowProc, ByVal i As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    4. Private Delegate Function EnumWindowProc(ByVal hWnd As IntPtr, ByVal parameter As IntPtr) As Boolean
    5. Private Const WM_GETTEXT As Integer = &HD
    6. Private Const WM_GETLENGTH As Integer = &HE
    7. Public Function GetText(ByVal handle As IntPtr) As String
    8. Dim length As Integer = GetLength(handle, WM_GETLENGTH, 0, 0)
    9. Dim sb As New StringBuilder(length)
    10. GetString(handle, WM_GETTEXT, length + 1, sb)
    11. Return sb.ToString
    12. End Function
    13. Public Function GetChildWindows(ByVal handle As IntPtr) As List(Of IntPtr)
    14. Dim result As New List(Of IntPtr)()
    15. Dim listHandle As GCHandle = GCHandle.Alloc(result)
    16. Try
    17. Dim childProc As New EnumWindowProc(AddressOf EnumWindow)
    18. EnumChildWindows(handle, childProc, GCHandle.ToIntPtr(listHandle))
    19. Finally
    20. If listHandle.IsAllocated Then
    21. listHandle.Free()
    22. End If
    23. End Try
    24. Return result
    25. End Function
    26. Private Function EnumWindow(ByVal handle As IntPtr, ByVal pointer As IntPtr) As Boolean
    27. Dim gch As GCHandle = GCHandle.FromIntPtr(pointer)
    28. Dim list As List(Of IntPtr) = TryCast(gch.Target, List(Of IntPtr))
    29. list.Add(handle)
    30. Return True
    31. End Function


    Aufruf:

    VB.NET-Quellcode

    1. For Each p As Process In Process.GetProcesses
    2. Dim parent As IntPtr = p.MainWindowHandle
    3. Dim node As TreeNode = tv.Nodes.Add(parent.ToString & " - " & GetText(parent))
    4. For Each child As IntPtr In GetChildWindows(parent)
    5. node.Nodes.Add(child.ToString & " - " & GetText(child))
    6. Next
    7. Next


    In Spy++ sind z.B. bei Skype alle Controls untereinander, was bei mir jedoch leider nicht der Fall ist (bei mir hat eher fast jedes Control ein eigenes TreeNode), aber ich weiß nicht, wie ich EnumChildWindows sonst noch benutzen soll..
    Bilder
    • Unbenannt.png

      119,6 kB, 1.280×800, 243 mal angesehen
    • Unbenannt2.png

      128,57 kB, 1.280×800, 232 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kraizy“ ()

    Verwende zum Posten der Bilder bitte einen werbungsfreien Server, z.B. vb-paradise.de.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dann mach mal so als kleine Übung ein Testprojekt nur mit einem TreeView. Nimm ausschließlich die Suchfunktion im Forum und bei Google.
    Wäre doch gelacht. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dass es sinnvoll ist, jedes kleine Teilproblem in einem separaten Projekt zu lösen. Wenn Du das immer so machst, hast Du bald eine ansehnliche Sammlung an Snippets, und wenn Du wieder ein neues Problem hast, sind 70% bereits in den Snippets vorrätig.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hast Du überhaupt schon mal einen TreeView befüllt?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dann solltest Du eigentlich kein Problem mit Deinen Prozessen haben. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wende doch mal Deinen Algorithmus nur auf ein einziges Fenster an, und auf dieses Fenster lässt Du Spy++ los.
    Beschreibe bitte mit Liste und verbal den Unterschied, nicht mit einem Bild.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also, z.B. bei Skype:

    VB.NET-Quellcode

    1. With New SendMessage
    2. Dim skype As IntPtr = Process.GetProcessesByName("skype")(0).MainWindowHandle
    3. Dim node As TreeNode = tv.Nodes.Add(skype.ToString & " - " & .GetText(skype))
    4. For Each child As IntPtr In .GetChildWindows(skype)
    5. node.Nodes.Add(child.ToString & " - " & .GetText(child))
    6. Next
    7. End With


    Mein Ergebnis und das von Spy++ sind im Anhang. Mein Problem ist nun, dass bei mir bloß 2 Ebenen in der TreeView sind: 1. Ebene ist Skype selbst und die 2. Ebene sind ALLE Untercontrols, egal ob ein Untercontrol seine eigenen Untercontrols hat oder nicht. Und ja ich weiß, mein Ergebnis kann mit dieser For Each Schleife auch gar nicht anders aussehen, deshalb frage ich auch, wie ich EnumChildWindows richtig anwenden muss, damit jedes Untercontrol richtig mit seinen eigenen Untercontrols aufgelistet wird.

    Es soll also aus:

    Quellcode

    1. [-]Skype
    2. [-]Untercontrol1
    3. [-]Untercontrol2
    4. [-]Untercontrol3
    5. [-]Untercontrol4
    6. [-]Untercontrol5

    Folgendes werden:

    Quellcode

    1. [-]Skype
    2. [-]Untercontrol1
    3. [-]Untercontrol2
    4. [-]Untercontrol1
    5. [-]Untercontrol2
    6. [-]Untercontrol3
    7. [-]Untercontrol3
    8. [-]Untercontrol4
    9. [-]Untercontrol1
    10. [-]Untercontrol2
    11. [-]Untercontrol3
    12. [-]Untercontrol5
    Bilder
    • Unbenannt.png

      100,26 kB, 1.280×800, 156 mal angesehen
    • Unbenannt2.png

      122,56 kB, 1.280×800, 155 mal angesehen

    Kraizy schrieb:

    egal ob ein Untercontrol seine eigenen Untercontrols hat oder nicht.
    Da musst Du halt auf jedes Deiner Fenster erneut EnumWindows drauf ansetzen, as ist wie bei der rekursiven Dateisuche und GetFiles().
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!