ALLE Fenster Handles

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von FAtheone.

    ALLE Fenster Handles

    Hey Leute!!

    Ich hab nen Problem :)

    Wie kann ich mir alle grade geöffneten Fenster hWnd-´s oder auch überschriften zurückgeben lassen!!

    Mir ist schon bewusst

    Quellcode

    1. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
    2. Private Declare Function GetWindowRect Lib "user32" Alias "GetWindowRect" (ByVal hwnd As IntPtr, ByRef lpRect As RECT) As Integer
    3. Private Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Integer, ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer


    aber ich brauch keine bestimmtes sondern alle...

    bitte um schnelle antwort


    THX

    headnut99 schrieb:

    aber ich brauch keine bestimmtes sondern alle...

    Bist Du Dir da gaaaaanz sicher ? :rolleyes:

    Ich hab da so meine Zweifel, da auch die Taskbar, Notify-Icons usw alles "Fenster" sind ! Und natürlich sind auch TextBoxen und andere Controls alles Fenster mit einem eigenen Handle.

    Die Auflistung erfolgt über die API enumChildWindows, der man eine Adresse für eine Callback-Methode mitgibt. Diese Methode wird dann für jedes gefundene ChildWindow aufgerufen.

    Ich geb Dir hier mal den Code aus meiner API-Library für die direkten Child-Windows des Desktops, vermute das sind eh schon mehr als Dir lieb sind. Für jedes gefundene Fenster wird noch der Titel und der KlassenName ausgedruckt.

    VB.NET-Quellcode

    1. Public Class frmControl
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. ' nur child windows vom Desktop abfragen
    4. Win32API.EnumChildWindows(Win32API.GetDesktopWindow, AddressOf enumWindowsProc, Nothing)
    5. End Sub
    6. Private Function enumWindowsProc(ByVal hWnd As IntPtr, ByVal lpParam As IntPtr) As Boolean
    7. Dim len As Integer
    8. ' get Title
    9. Dim title As String = Space(255)
    10. len = Win32API.GetWindowText(hWnd, title, 255)
    11. title = title.Substring(0, len)
    12. ' get className
    13. Dim className As String = Space(255)
    14. len = Win32API.GetClassName(hWnd, className, 255)
    15. className = className.Substring(0, len)
    16. ' format output
    17. Dim formattedOutput As String = String.Format("{0,-10} {1,-50} {2} ", hWnd, className, title)
    18. Trace.WriteLine(formattedOutput)
    19. ' next
    20. Return True
    21. End Function
    22. ' Unmanaged API Deklarationen / Structures
    23. Class Win32API
    24. '------------------------------------------
    25. '-- API Deklarationen ---
    26. '------------------------------------------
    27. ' API Deklarationen
    28. Public Declare Function EnumChildWindows Lib "user32.dll" (ByVal hWndParent As IntPtr, ByVal lpEnumFunc As Win32Callback, ByVal lParam As IntPtr) As IntPtr
    29. Public Declare Function GetDesktopWindow Lib "user32" () As IntPtr
    30. Public Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" (ByVal hwnd As IntPtr, ByVal lpClassName As String, ByVal nMaxCount As Integer) As Integer
    31. Public Declare Auto Function GetWindowText Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As Integer) As Integer
    32. '------------------------------------------
    33. '-- Delegates ---
    34. '------------------------------------------
    35. Public Delegate Function Win32Callback(ByVal hwnd As IntPtr, ByVal lParam As IntPtr) As Boolean
    36. End Class
    37. End Class


    Have Fun ;)
    OK das sind wenig :P

    Bin auf die gloreiche idee gekommen die in eine MSGbox umzuleiten weil ich kA hab was "Trace.WriteLine(formattedOutput)" dat is.

    TUES NICH

    Junge so viele Handles :P

    Trotzdem Danke für die schnelle Hilfe!

    Habt ihr irgendwelche Ideen die zu filtern ? bzw. ohne Childs etc

    komm noch net drauf klar lols

    zb Soll nur Mozilla, MS Studios, Office, Blend und icq angezeigt werden!

    Wer echt super :P
    THX

    @FAtheone

    Das bringt mich net weiter denn ich möchte keine liste aufstellen wo schlüsselwörter drin sind, die wird einfach zu lang!

    @SystemUnknown
    Sry, aber bin ziemlich neu in VB!

    1. Wo findet ihr immer diese API dinger?
    2. Kannst mal Sample Code posten? Weil was ist,

    Quellcode

    1. BOOL WINAPI EnumWindows(
    2. __in WNDENUMPROC lpEnumFunc,
    3. __in LPARAM lParam
    4. );

    bzw. was sagt mir das? echt kein Plan!

    mfg headnut

    FAtheone schrieb:

    Zum Beispiel Fenstertitel mit Contains auf Schlüsselwörter überprüfen?
    @Kangaroo:
    <DllImport()>Aus InteropServices ist die modernere Variante

    Tut mir leid, aber ich pack immer lieber alles in 1 Zeile, auch wenn die manchmal ziemlich länglich werden :whistling:

    @

    headnut99 schrieb:

    Wo findet ihr immer diese API dinger?

    Also bisher war immer PInvoke.Net der Standard, mittlerweile ist es einfacher geworden die Fragen hier im Forum zu stellen.

    headnut99 schrieb:


    Das bringt mich net weiter denn ich möchte keine liste aufstellen wo schlüsselwörter drin sind, die wird einfach zu lang!


    Dann nach Printables suchen (Alle Fenster mit nicht-Druckbaren Zeichen nicht anzeigen (Gefährlich, da z.B. FF auch den Titel der Website anzeigt, die durchaus auch mal Unicode sein kann)
    I.d.R. haben "unwichtige" Fenster gar keinen Titel (offensichtlich kann man diese demnach auch Filtern)

    @Kangaroo:

    <DllImport()> ist auch ein Einzeiler, wenn man will ;) (Okay, Imports System.InteropServices zählt nicht)
    Danke leute :P super

    aber ich komm mit vb 2008 und höher mal gar net mehr klar

    Im Praktikum nur mit Vb 6.0 gearbeitet, hätt ich net gedacht aber vb 6.0 is so schön einfach lol^^

    1. Frage: Wie zum teufel muss meine Klasse in der frmMain deklarieren um auf functionen zugreifen zu können ,welche in der klasse sind!
    Bisher

    Quellcode

    1. 'Möglichkeit 1
    2. Dim clsWindow As Object = New cWindows
    3. 'Möglichkeit 2
    4. Dim clsWindow As Object
    5. clsWindow = New cWindows


    wenn ich dan sage clsWindow.(Function) geht das net weill er die net kennt

    Die Funktion ist public und auf die API welche sich in der Klasse befinden kann ich zugreifen...

    HILFE!

    mfg Headnut
    Danke leute :P super


    Aber danke :)

    Das funzt, Danke

    Ey ich hätt nie gedacht das man so aus der übung sein kann, wenn 4 wochen mit ner anderen umgebung arbeitet.

    Danke an alle ;)

    Mfg Headnut

    /edit
    Bin halt net son Forumianer :P

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

    hey :P

    Ich weiß auch nichts was los ist, ihr denkt wahrscheinlich ich kann nichts loL

    ^^

    PROBLEM:

    1. Hab ne Structur

    Quellcode

    1. Public Structure structWindows
    2. Dim strTitle As String
    3. Dim intHandle As Integer
    4. End Structure


    2. Die deklariere ich dann

    Quellcode

    1. '### 1 ###
    2. 'Fehler: Arrays können nicht mit "New" deklariert werden. (Is ja klar)
    3. Dim stCurrentWindows() As New structWindows
    4. '### 2 ###
    5. 'Fehler: Keinen
    6. Dim stCurrentWindows() As structWindows
    7. 'aber wenn ich nun in das Array reinschreiben will...
    8. stCurrentWindows(i).strTitle = title
    9. stCurrentWindows(i).intHandle = hWnd
    10. 'Fehler: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt. (Wahrscheinlich wegen fehlendem "New" bei der Dekleration)


    Sry das ich so viel frage :(
    Ich denke glaub immer noch in VB 6.0...
    mfg Headnut
    Typischer Fehler wenn man Arrays ohne feste Grenzen benutzt, denn mit

    VB.NET-Quellcode

    1. Dim stCurrentWindows() As structWindows
    definierst Du erst einmal nur ein Array ohne feste Grenzen, d.h. es wurde kein Speicherplatz für nur ein einziges Element reserviert. Dafür musst Du für das Array feste Grenzen mitgeben, also

    VB.NET-Quellcode

    1. Dim stCurrentWindows(100) As structWindows ' geht auch nachträglich mit der Redim Anweisung


    In .Net sind Arrays etwas aus der Mode gekommen, weil die List ( of T) viel bequemer und einfacher sind:

    VB.NET-Quellcode

    1. Dim stCurrentWindows() As List( of structWindows)
    2. ' element zur Liste hinzufügen
    3. dim actWin as structWindows
    4. stCurrentWindows.add(actWin)

    Listen kann man entweder mit For Each durchlaufen oder ganz normal wie bei Arrays über den Index For i=0 to List.count-1

    Edit: In Deiner Structur bitte den Handle statt Integer als IntPtr definieren
    Ich geb dir gleich mla typischer fehler :P Nein spaß^^

    thx für die ausführliche antwort!

    Aber in Vb 6.0 ist es so das ein Array nur ohne grenzen neu definiert werden kann. Redim ging nur ohne grenzen, deshalb der fehler. Wie auch immer das ist jetz .net muss noch einiges lernen wie es scheint :P

    Ich probier mich mal mit einer liste,wenn das so modern is :))

    Ein IntPtr ist doch ein "IntegerPointer", warum ist das besser, den in einer Structur zu verwenden? In VB 6.0 war das meist des Performence willen, wobei es da ja noch "Types" waren :P

    /edit:

    so hab das jetz zum laufen bekommen!
    Aber noch eine Sache die ich net verstehe ist, was mir das jetzt sagt:

    Quellcode

    1. BOOL WINAPI EnumWindows(
    2. __in WNDENUMPROC lpEnumFunc,
    3. __in LPARAM lParam
    4. );
    5. ' zu das (Google ftww)
    6. Public Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
    7. 'aber wie verwende ich das denn jetz?
    8. 'Ich hab jetz den Aufruf abgeändert also:
    9. 'API:
    10. Public Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As Win32Callback, ByVal lParam As IntPtr) As IntPtr
    11. 'Aufruf
    12. EnumWindows(AddressOf enumWindowsProc, Nothing)


    Der Code läuft dan zwar durch bin mir aber nicht bewusst wie und warum? Kurz gesagt ich versteh den net :P



    Mfg headnut

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „headnut99“ ()

    das sind API Deklarationen:

    VB.NET-Quellcode

    1. Public Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long



    zeiger auf WindoProc Prozedur (siehe Code von Kanagro):

    VB.NET-Quellcode

    1. EnumWindows(AddressOf enumWindowsProc, Nothing)
    system auch wenns nicht viel war, hats bei mir "klick" gemacht :P thx

    Ich komme jetz auf eine anzahl von 60-70 Windows, noch eine menge kram bei die ich net brauch

    ist gefiltert nach

    • - IsWindowVisible
    • - title.length > 0
    • - enumWindows statt enumChildWindows
    • - "Default" und "MSCTFIME UI" sind als Sonderbehandlung auch noch raus!



    Quellcode

    1. If IsWindowVisible(hWnd) = False Then
    2. If title.Length > 0 And title.Contains("Default") = False Then
    3. If title.Contains("MSCTFIME UI") = False Then
    4. stCurrentWindows(i).strTitle = title
    5. stCurrentWindows(i).intHandle = hWnd
    6. i += 1
    7. End If
    8. End If
    9. End If


    Fällt euch noch irgenwas ein?

    Ein möglichkeit wär ja noch zu gucken ob die in der Taskbar oder in der Minibar(unten rechts) sind ist das Möglich?

    /edit
    OK epic failll

    If IsWindowVisible(hWnd) = False Then

    statt

    If IsWindowVisible(hWnd) = True Then

    Ja so kans gehen :P trotzdem THX:P

    Ich spick den Code noch mit Comments und stell den rein :P

    mfg headnut