Listbox1 auf Listview1 Übertrag mit Fehler!

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Gonger96.

    @Cheffboss Ja und?
    Mit dem Wissen aus Post #19 müsstest Du doch allein auf die Idee kommen, statt GetWindowTextA() einfach mal GetWindowText() ohne "A" zu probieren :!:
    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!
    @RodFromGermany
    Ja, das habe ich nun versucht.
    Aber leider sind dann die Parameter falsch.
    Ich werde morgen weiter machen...

    VB.NET-Quellcode

    1. Public Function GetWindowText(ByVal hwnd As Integer, ByVal lpString As System.Text.StringBuilder, ByVal cch As Integer) As Integer
    2. End Function


    Visual Basic.NET 8o
    MS-SQL
    8o
    @Cheffboss So was:

    VB.NET-Quellcode

    1. Dim windowText As StringBuilder
    2. windowText = New StringBuilder(1024)
    3. Dim retVal = GetWindowText(hwnd, windowText, windowText.Capacity)
    4. If retVal <> 0 Then
    5. Dim txt = windowText.ToString().Substring(0, retVal)
    6. ListBox1.Items.Add(txt)
    7. End If
    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!
    @RodFromGermany
    So eigentlich wollte ich Feierabend machen, aber dass ich das Problem gelöst haben will, habe ich mich nochmals vorm PC gesetzt.
    Damit ich morgen weiter machen kann, wenn das Problem weg ist.

    Hier der Code:

    VB.NET-Quellcode

    1. Public Sub ProzesseInListBoxEinfügen()
    2. Me.ListBox1.DataSource = Nothing
    3. Me.ListBox1.Items.Clear()
    4. Dim wi As PWINDOWINFO
    5. Dim lngHwnd As Integer
    6. wi.cbSize = Len(wi)
    7. lngHwnd = GetWindow(GetDesktopWindow(), GW_CHILD) ' Erstes Kindfenster des Desktops
    8. Do Until lngHwnd = 0
    9. ' Zeige das Fenster, wenn es einen Titel hat und sichtbar ist
    10. GetWindowInfo(lngHwnd, wi)
    11. If (wi.dwStyle And &H10CF0000) = &H10CF0000 Then
    12. ' 1. Informationen auslesen...
    13. If Module1.GetHwndEXE(lngHwnd) <> "" Then
    14. Me.ListBox1.Items.Add((((GetWindowTitle(lngHwnd)) & splitZeichen & Module1.GetHwndEXE(lngHwnd).ToLower)))
    15. End If
    16. End If
    17. lngHwnd = GetWindow(lngHwnd, GW_HWNDNEXT)
    18. Loop
    19. ' 2 Informationen auslesen...
    20. For Each prozlist As Process In Process.GetProcesses
    21. If prozlist.MainWindowTitle <> "" Then
    22. Me.ListBox1.Items.Add((prozlist.MainWindowTitle) & splitZeichen & prozlist.MainModule.FileName.ToLower)
    23. End If
    24. Next
    25. End Sub
    26. Private Function GetWindowTitle(ByVal hWnd As IntPtr) As String
    27. Dim titleLength As Integer
    28. Dim title As Text.StringBuilder
    29. ' Länge des Titles bestimmmen (0 = 1, 1 = 2 usw. wichtig für die erstellung des string buffers)
    30. titleLength = Win32Functions.GetWindowTextLength(hWnd) + 1
    31. If titleLength = 1 Then Return String.Empty
    32. ' string buffer erstellen
    33. title = New Text.StringBuilder(titleLength)
    34. ' Titel in den buffer schreiben
    35. Win32Functions.GetWindowText(hWnd, title, titleLength)
    36. Return title.ToString
    37. End Function
    38. Public Class Win32Functions
    39. Declare Auto Function FindWindow Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    40. Declare Auto Function GetWindowText Lib "user32" (ByVal hwnd As IntPtr, ByVal lpString As Text.StringBuilder, ByVal nMaxCount As Integer) As Integer
    41. Declare Auto Function GetWindowTextLength Lib "user32" (ByVal hwnd As IntPtr) As Integer
    42. End Class


    Ich werde es morgen gründlich testen, und hoffe dass ich das Problem mit eurer Hilfe gelöst habe!
    Kannst du mir mal bitte sagen, was der Unterschied zwischen GetWindowText und GetWindowTextA ist?
    Wenn es nun mit GetWindowText geht, wieso gibt es dann auch das GetWindowTextA?
    Das frage ich mich, gerade.
    Nach dem testen, morgen gebe ich Bescheid!

    Außerdem noch eine Frage! :!:
    Ich gebe als String: Fenstertitel#pfadmitexe.
    Wenn ich nun den String Splitte in zwei Werte.
    Darf ich es nicht mit einem # splitten, da manche Webseiten dieses
    Symbol als Fenstertitel haben.
    Deshalb Suche ich ein Zeichen, das nie ein Fenstertitel sein kann.
    Dieses Zeichen habe ich mir ausgesucht ^.
    Welches Zeichen könnt Ihr mir empfehlen?

    VB.NET-Quellcode

    1. ' brauche ein Zeichen die niemals auf der Webseite-Title sind!
    2. Dim splitZeichen As String = "^"


    BIG THX :thumbup:
    Visual Basic.NET 8o
    MS-SQL
    8o

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

    Cheffboss schrieb:

    Unterschied zwischen GetWindowText und GetWindowTextA
    Eigentlich gibt es ein GetWindowTextA() und ein GetWindowTextW(). Das A steht für Ansi (8-Bit-Zeichen), das W für WideChar (16-Bit-Zeichen).
    .NET arbeitet grundsätzlich mit Unicode, also 16-Bit-Zeichen, da ist in sich alles rund.

    Cheffboss schrieb:

    Dieses Zeichen habe ich mir ausgesucht ^.
    Was ist Deine Intention bei der Verwendung dieses Zeichens?
    Wenn es auch ein String sein kann, nimm z.B. " => ".
    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!
    Ich interveniere. Gar kein Splitzeichen so verwenden. Irgendwann kommt trotzdem eine doofe Situation. Speichere Titel und Pfad in einer passenden Klasseninstanz und füge deren Daten dann dem ListView, ggf. auch mit einem Splitzeichen ein. Aber wenn Du die Daten wieder getrennt brauchst, nimmst Du die Klasse her und versuchst nicht, einen String aufzusplitten, in der Hoffnung, dass es nur an einer Stelle auftaucht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @RodFromGermany
    Vielen Dank, für deine Hilfe. :thumbup:
    Außerdem noch Vielen Dank für deine Erklärungen -
    Jetzt macht alles einen Sinn!
    Ich habe nun den Unterschied verstanden!
    Dieses Problem hat mich 3 Tage lang beschäftigt, und die Lösung war so simpel.
    Aber Hauptsache habe ich daraus etwas gelernt!

    Was ist Deine Intention bei der Verwendung dieses Zeichens?

    Eigentlich wollte ich eine # verwenden, aber ich habe herausgefunden das es Webseiten gibt, die dieses im Fenstertitel haben, deshalb wird dann der Wert falsch ausgelesen.
    Deshalb suchte ich nach einem Zeichen das niemals oder sehr selten existiert.
    Um dieses Problem in den Griff zu bekommen.

    @VaporiZed
    Danke, ich werde mir das noch anschauen. :thumbup:

    @an alle :)
    Ich möchte mich wirklich sehr bedanken, Ihr habt mir bei meinem Problem sehr geholfen.
    Das Forum und die Member sind die besten!
    Ich liebe das Forum und besuche es jeden Tag! <3 <3 <3
    BIG THX

    Ich habe mein Projekt mal für euch hochgeladen, falls jemand das gleiche Problem haben sollte.



    Link:
    AlleFensterUndProzesseAuslesen.zip
    Visual Basic.NET 8o
    MS-SQL
    8o

    Cheffboss schrieb:

    Deshalb suchte ich nach einem Zeichen das niemals oder sehr selten existiert.

    Die Sinnvollste Lösung ist natürlich eine Klasse/Struct für die Daten anzulegen und nicht zusammenzuführen was getrennt bleiben soll. Trotzdem wollte ich mal hinzufügen, dass man in so einem Fall Escape-Sequenzen benutzen kann. Es können nämlich alle Zeichen vorkommen.
    Das Trennzeichen wird escaped, so kann jedes beliebige Zeichen genutzt werden. Nimmt man z.B. 'a', dann wird daraus "\a" (das '\' ist das Escapezeichen). Das Escapezeichen muss natürlich auch escaped werden.

    Aus "Das Fenster","C:\abc.exe" wird dann "Das Fenster\aC:\\abc.exe". Der String lässt sich mit Regex anschließend immer in die zwei Teile splitten. Man könnte natürlich auch direkt das Escapezeichen als Separator benutzen.