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.

    Listbox1 auf Listview1 Übertrag mit Fehler!

    Moin! :)
    Ich habe leider wieder ein neues Problem.
    Ich lese alle Prozesse und Fenstertitel aus, und kopiere diese in eine Listbox.
    Danach übertrage ich die Daten in ein Listview.
    Genau hier ist das Problem!
    Ich prüfe das immer nur ein neuer Wert hinzukommt.
    Leider haben manche Fenstertitel komische Sonderzeichen diese man nur im notepad++ sieht.
    Meine Frage ist, wie ich das Fragezeichen aus dem String bekomme?
    Da ein Replace nicht geht und ich schon viele Sachen ausprobiert habe, ohne Erfolg!
    Im Anhang Bild und Quellcode.
    Als Beispiel ist die Listbox mit den Strings bereits aufgelistet.
    BIG THX





    Quellcode:
    im meinen letzen Beitrag ist die Lösung!
    Visual Basic.NET 8o
    MS-SQL
    8o

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

    Dubiose Sonderzeichen die man so nicht sieht kann man per regex raus werfen indem man dort die zulässigen Zeichen definiert.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Leider wird "WhatsApp - Profil 1 – Microsoft Edge" zweimal in der Listview1 angezeigt.
    Weil es einen Wert gibt der, diesen gleichen Namen hat.
    Aber leider mit einem Sonderzeichen, diese man nur im notepad++ sieht.
    Jetzt suche ich eine Möglichkeit, dieses seltsame Zeichen los zu bekommen.
    Damit der Eintrag nur einmal aufgelistet wird!
    Ich hoffe ich könnte es gut erklären.
    BIG THX
    Visual Basic.NET 8o
    MS-SQL
    8o

    Cheffboss schrieb:

    Meine Frage ist, wie ich das Fragezeichen aus dem String bekomme?
    @mrMo
    Verwendet das richtige Encoding.
    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!
    Auf deinem Bild sieht man irgendwie kein Sonderzeichen, aber hiermit solltest du deine Strings bereinigen können:

    VB.NET-Quellcode

    1. Regex.Replace(DeinString, "[^A-Za-z0-9\-/]", "")


    Meine Website:
    www.renebischof.de

    Meine erste App (Android):
    PartyPalooza
    @mrMo
    Danke, für deinen Vorschlag. :)
    Bis jetzt habe ich leider noch kein passenden RegEX Code gefunden.
    Ich finde nur welche, die Sonderzeichen entfernt, diese aber sichtbar sind!

    Hier mein Code:

    VB.NET-Quellcode

    1. Public Shared Function CheckString(ByVal text As String) As String
    2. Return System.Text.RegularExpressions.Regex.Replace(text, "[\x00-\x2f\x3a-\x40]", String.Empty)
    3. End Function


    @RodFromGermany
    Danke für deine Antwort.
    Da ich keinen Text aus einer Textdatei auslese, kann ich soweit ich weiß kein Encoding machen.
    Ich habe aber versucht, den String doch ein anderes Encoding zu geben.
    Ohne Erfolg! ;(

    VB.NET-Quellcode

    1. Public Shared Function CheckString(ByVal text As String) As String
    2. Dim b() As Byte = Encoding.Default.GetBytes(text)
    3. Dim s1 As String = System.Text.Encoding.UTF8.GetString(b)
    4. Return s1.Replace("?", "")
    5. End Function


    @xored
    Danke, für deine Antwort. :)
    Leider entfernt der RegEX Code nicht das versteckte Zeichen.
    Dieses kann man wie gesagt, nur im notepad++ sehen.
    Visual Basic.NET 8o
    MS-SQL
    8o
    Weiterer Vorschlag: Zum Vergleichen der Strings einen Matchcode bilden, der nur aus Buchstaben und zahlen besteht.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Cheffboss schrieb:

    VB.NET-Quellcode

    1. Public Shared Function CheckString(ByVal text As String) As String
    Woher hat denn der Aufrufer dieser Prozedur den String?
    Bereits hier wurde etwas falsch gemacht.
    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!

    Cheffboss schrieb:

    @xored
    Danke, für deine Antwort.
    Leider entfernt der RegEX Code nicht das versteckte Zeichen.
    Dieses kann man wie gesagt, nur im notepad++ sehen.
    kann nicht sein. Der Regex haut mit Sicherheit sämliche Sonderzeichen weg (und auch einige mehr).
    Vermutlich verwendest du ihn falsch.
    Wieso denn eigentlich »Sonderzeichen, welches man nur in NP++ sieht«? Zwischen Microsoft und Edge scheint einmal 1 Leerzeichen zu sein und einmal sind's m.E. zwei. Zumindest laut ListView-Ansicht. Was sagt denn der ASCII-Wert an der Stelle nach Microsoft? Oder Convert.ToInt
    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.
    @mrMo
    Danke, für deine Antwort. :)
    Leider komme ich auch nicht weiter(Matchcode).
    Mein Lösungsansatz muss ich noch sehr überarbeiten.



    @RodFromGermany
    Den Code bekomme ich vom Übertrag von der Listbox1 auf die Listview.
    Genau dort ist auch der Wert Falsch.
    Da dieser so in die Listbox kopiert wurden ist.

    VB.NET-Quellcode

    1. For Each test As String In Me.ListBox1.Items
    2. Dim sp() As String = test.Split(CType(splitZeichen, Char()))
    3. If Not alteWerte.Contains(sp(0).Replace(" ", splitZeichen)) Then
    4. wert = sp(0) & " "
    5. If Not sp(0).Contains((wert)) Then
    6. Me.ListView1.Items.Add(((sp(0).TrimStart))).SubItems.Add(sp(1))
    7. alteWerte.Add(CheckString(sp(0).Replace(" ", splitZeichen)))
    8. End If
    9. End If
    10. Next


    @ErfinderDesRades
    Ich suche nochmals ein anderes RegexCode, habe aber bereits schon viele ausprobiert.
    So wie es VaporiZed gesagt hat, es ist vielleicht kein Sonderzeichen, einfach ein unbekanntes unsichtbares!
    Deshalb kann ich nicht einfach, diesen Wert replacen.

    @VaporiZed
    Danke, für deine Nachricht. :)
    Wie man den ASCII-Wert herausbekommt weiß ich nicht.
    Aber wenn ich in Notepad++ eingebe, ANSI Codierung wird ein Fragezeichen angezeigt!
    Visual Basic.NET 8o
    MS-SQL
    8o

    Cheffboss schrieb:

    Da dieser so in die Listbox kopiert wurden ist.
    Mit welchem Code also fügst Du den Eintrag der ListBox hinzu?
    Lass Dir nicht jede Antwort aus der Nase ziehen, Du brauchst nur 2 Minuten, den Übeltäter zu ermitteln, also tue es.
    Debuggen, Fehler finden und beseitigen
    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 füge ich die Werte in die Listbox.
    Genau hier, beim Einfügen, hat sich das böse Zeichen versteckt.
    Habe versucht eine andre WIN-API deklaration zu finden, aber das war leider auch nicht richtig.
    Benötigst du noch den Code aus dem Modul1?
    Falls Ja, habe ich diesen hochgeladen.
    THX

    VB.NET-Quellcode

    1. #Region "FenstertitelUndProzesseAuslesen"
    2. Declare Function GetDesktopWindow Lib "user32" () As Integer
    3. Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal uCmd As Long) As Long
    4. Private Declare Function GetWindowTextA Lib "user32" (ByVal hwnd As Long, ByVal lpString As String, ByVal nMaxCount As Long) As Long
    5. Private Declare Function GetWindowInfo Lib "user32" (ByVal hwnd As Long, ByRef pwi As PWINDOWINFO) As Boolean
    6. Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Integer, ByVal uCmd As Integer) As Integer
    7. Private Declare Function GetWindowTextA Lib "user32" (ByVal hWnd As Integer, ByVal lpString As String, ByVal nMaxCount As Integer) As Integer
    8. Private Declare Function GetWindowInfo Lib "user32" (ByVal hWnd As Integer, ByRef pwi As PWINDOWINFO) As Boolean
    9. ' Typen für GetWindowInfo
    10. Private Structure RECT
    11. Dim Left_Renamed As Integer
    12. Dim Top As Integer
    13. Dim Bottom As Integer
    14. End Structure
    15. Private Structure PWINDOWINFO
    16. Dim cbSize As Integer ' Strukturgröße
    17. Dim rcWindow As RECT ' Fensterkoordinaten
    18. Dim rcClient As RECT ' Clientkoordinaten
    19. Dim dwStyle As Integer ' Gibt WINDOWS_STYLES zurück
    20. Dim dwExStyle As Integer ' Gibt EXTENDED_WINDOWS_STYLES zurück
    21. Dim dwWindowStatus As Integer ' 1=Fenster ist aktives Fenster, 0=Fenster nicht aktiv
    22. Dim cxWindowBorders As Integer ' Rahmenbreite in px
    23. Dim cyWindowBorders As Integer ' Rahmenhöhe in px
    24. Dim atomWindowType As Short
    25. Dim wCreatorVersion As Short
    26. End Structure
    27. Private Const GW_CHILD As Short = 5 ' GetWindow: Erstes Kindfenster
    28. Private Const GW_HWNDNEXT As Short = 2 ' GetWindow: Nächstes Fenster gleicher Ebene
    29. Public Sub ProzesseInListBoxEinfügen()
    30. Me.ListBox1.DataSource = Nothing
    31. Me.ListBox1.Items.Clear()
    32. Dim strTitel As String
    33. Dim wi As PWINDOWINFO
    34. Dim lngHwnd As Integer
    35. wi.cbSize = Len(wi)
    36. lngHwnd = GetWindow(GetDesktopWindow(), GW_CHILD) ' Erstes Kindfenster des Desktops
    37. Do Until lngHwnd = 0
    38. ' Zeige das Fenster, wenn es einen Titel hat und sichtbar ist
    39. GetWindowInfo(lngHwnd, wi)
    40. If (wi.dwStyle And &H10CF0000) = &H10CF0000 Then
    41. ' Titel des Fensters ermitteln
    42. strTitel = New String(CChar(vbNullChar), 255)
    43. GetWindowTextA(lngHwnd, strTitel, 255)
    44. strTitel = Replace(strTitel, vbNullChar, "")
    45. ' 1. Informationen auslesen...
    46. If strTitel <> "" AndAlso Module1.GetHwndEXE(lngHwnd) <> "" Then
    47. Me.ListBox1.Items.Add(((DelSpecCharInDotNet(strTitel) & splitZeichen & Module1.GetHwndEXE(lngHwnd).ToLower)))
    48. End If
    49. End If
    50. lngHwnd = GetWindow(lngHwnd, GW_HWNDNEXT)
    51. Loop
    52. ' 2 Informationen auslesen...
    53. For Each prozlist As Process In Process.GetProcesses
    54. If prozlist.MainWindowTitle <> "" Then
    55. Me.ListBox1.Items.Add(DelSpecCharInDotNet(prozlist.MainWindowTitle) & splitZeichen & prozlist.MainModule.FileName.ToLower)
    56. End If
    57. Next
    58. End Sub
    59. Private Function DelSpecCharInDotNet(strSource As String, Optional strPattern As String = "/W") As String
    60. Return (System.Text.RegularExpressions.Regex.Replace((strSource), strPattern, "").Replace("?", " "))
    61. End Function
    62. #End Region


    Module1.vb
    Visual Basic.NET 8o
    MS-SQL
    8o

    Cheffboss schrieb:

    Genau hier, beim Einfügen, hat sich das böse Zeichen versteckt.
    Bei welchem Befehl?
    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
    Bei Zeile 51, ist der Fehler, bzw. ist das versteckete Zeichen vorhanden.

    VB.NET-Quellcode

    1. Me.ListBox1.Items.Add(((DelSpecCharInDotNet(strTitel) & splitZeichen & Module1.GetHwndEXE(lngHwnd).ToLower)))

    VB.NET-Quellcode

    1. DelSpecCharInDotNet(strTitel)



    Visual Basic.NET 8o
    MS-SQL
    8o
    @Cheffboss Große Klasse. X(
    Da ich Deinen Code perfekt kenne, weiß ich, was in Module1.GetHwndEXE() passiert.
    Ich will von Dir den Code sehen, der ursprünglich die falschen Zeichen erzeugt.
    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
    Sorry, ich habe erst jetzt gemerkt welchen Code du brauchst.
    Ich habe das Modul auch hochgeladen.
    Ich habe in dieser Funktion "GetHwndEXE" auch nach
    einem Text Encoding Einstellung gesucht.
    Habe aber keine gefunden...

    VB.NET-Quellcode

    1. Public Function GetHwndEXE(ByVal hWnd As Integer) As String
    2. Dim lProcessID, lThread As Integer
    3. Dim lProcessHandle As Integer
    4. Dim sName As String = ""
    5. Dim lModule As Integer
    6. Dim bMore As Boolean
    7. Dim tPROCESS As PROCESSENTRY32 = Nothing
    8. Dim lSnapShot As Integer
    9. lThread = GetWindowThreadProcessId(hWnd, lProcessID)
    10. 'If CheckVersion() = VER_PLATFORM_WIN32_WINDOWS Then
    11. ' Windows 9x
    12. ' lSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
    13. ' If lSnapShot < 0 Then Exit Function
    14. ' tPROCESS.dwSize = Len(tPROCESS)
    15. ' bMore = Process32First(lSnapShot, tPROCESS)
    16. ' While bMore And tPROCESS.th32ProcessID <> lProcessID
    17. ' bMore = Process32Next(lSnapShot, tPROCESS)
    18. ' End While
    19. ' If tPROCESS.th32ProcessID = lProcessID Then
    20. ' sName = Left(tPROCESS.szExeFile, InStr(tPROCESS.szExeFile, Chr(0)) - 1)
    21. ' GetHwndEXE = sName
    22. ' End If
    23. 'Else
    24. ' Win NT
    25. lProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, lProcessID)
    26. If CBool(lProcessHandle) Then
    27. If CBool(EnumProcessModules(lProcessHandle, lModule, 4, 0)) Then
    28. sName = Space(260)
    29. Call GetModuleFileNameExA(lProcessHandle, lModule, sName, Len(sName))
    30. GetHwndEXE = sName
    31. End If
    32. Call CloseHandle(lProcessHandle)
    33. End If
    34. ' End If
    35. Return sName.Trim.Replace(vbNullChar, "")
    36. End Function



    edit1:

    VB.NET-Quellcode

    1. Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Integer, ByRef lppe As PROCESSENTRY32) As Integer
    2. Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Integer, ByRef lppe As PROCESSENTRY32) As Integer
    3. Private Declare Function CloseHandle Lib "Kernel32.dll" (ByVal Handle As Integer) As Integer
    4. Private Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Integer, ByVal bInheritHandle As Integer, ByVal dwProcId As Integer) As Integer
    5. Private Declare Function GetModuleFileNameExA Lib "psapi.dll" (ByVal hProcess As Integer, ByVal hModule As Integer, ByVal ModuleName As String, ByVal nSize As Integer) As Integer
    6. Private Declare Function EnumProcessModules Lib "psapi.dll" (ByVal hProcess As Integer, ByRef lphModule As Integer, ByVal cb As Integer, ByRef cbNeeded As Integer) As Integer
    7. Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Integer, ByVal th32ProcessID As Integer) As Integer
    8. Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Integer
    9. Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Integer, ByRef lpdwProcessId As Integer) As Integer

    Visual Basic.NET 8o
    MS-SQL
    8o
    @Cheffboss Na geht doch.
    Nimm statt GetModuleFileNameExA() => GetModuleFileNameEx() (ohne "A")
    und die richtige VB.NET-Signatur.
    pinvoke.net/default.aspx/coredll/GetModuleFileNameEx.html
    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
    Hat leider auch nicht geklappt.
    Die Funktion Module1.GetHwndEXE gibt den Pfad richtig aus!
    Das Problem liegt mehr an der GetWindowTextA(lngHwnd, strTitel, 255).

    VB.NET-Quellcode

    1. Private Declare Function GetWindowTextA Lib "user32" (ByVal hWnd As Integer, ByVal lpString As String, ByVal nMaxCount As Integer) As Integer

    Denn genau dieser Code liest das unsichtbare Zeichen aus.
    Das ist der Fenstertitel! :!:

    edit2:
    Ich werde morgen weiter machen....
    Gebe dann Bescheid!
    Vielen Dank an alle! :thumbsup:
    Visual Basic.NET 8o
    MS-SQL
    8o

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