Prozesse den Ram und Namen anzeigen!

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Tizu170.

    Prozesse den Ram und Namen anzeigen!

    Moin! :)
    Ich möchte gerne alle Prozesse die aktiv sind, diese ein Fenster haben, anzeigen lassen.
    Leider zeigt das zweite Listview, die Einträge doppelt an.
    Obwohl es z.B nur zwei Editoren gestartet sind, zeigt es dann mehrfach an.
    Wie kann ich das Problem lösen?
    BIG THX

    VB.NET-Quellcode

    1. Public Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As _
    2. EnumWindowsProc, ByVal lParam As Int32) As Int32
    3. Public Declare Function IsWindowVisible Lib "user32.dll" (ByVal hwnd As _
    4. IntPtr) As Boolean
    5. Public Delegate Function EnumWindowsProc(ByVal hwnd As IntPtr, ByVal lParam _
    6. As Int32) As Boolean
    7. Public Declare Function GetWindowText Lib "user32.dll" Alias _
    8. "GetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch _
    9. As Int32) As Int32
    10. Public Declare Function GetWindowTextLength Lib "user32.dll" Alias _
    11. "GetWindowTextLengthA" (ByVal hwnd As IntPtr) As Int32
    12. Public Declare Function GetWindowLong Lib "user32.dll" Alias _
    13. "GetWindowLongA" (ByVal hwnd As IntPtr, ByVal nIndex As Int32) As Int32
    14. Public Declare Function GetParent Lib "user32.dll" (ByVal intptr As IntPtr) _
    15. As IntPtr
    16. Public Const GWL_HWNDPARENT As Int32 = -8
    17. Private newwindowlist As List(Of String)
    18. Private Function EnumWinProc(ByVal hwnd As IntPtr, ByVal lParam As Int32) _
    19. As Boolean
    20. If IsWindowVisible(hwnd) Then
    21. If GetParent(hwnd) = IntPtr.Zero Then
    22. If GetWindowLong(hwnd, GWL_HWNDPARENT) = 0 Then
    23. Dim str As String = String.Empty.PadLeft(
    24. GetWindowTextLength(hwnd) + 1)
    25. GetWindowText(hwnd, str, str.Length)
    26. If Not String.IsNullOrEmpty(str.Substring(0, str.Length -
    27. 1)) Then newwindowlist.Add(str.Substring(0, str.Length -
    28. 1))
    29. End If
    30. End If
    31. End If
    32. EnumWinProc = True
    33. End Function
    34. Private Sub RefreshWindowList()
    35. newwindowlist = New List(Of String)
    36. EnumWindows(AddressOf EnumWinProc, CInt(True))
    37. End Sub
    38. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    39. RefreshWindowList()
    40. Me.ListView1.Items.Clear()
    41. Me.ListView2.Items.Clear()
    42. For Each item As String In newwindowlist
    43. If Not item = "Program Manager" Then
    44. Me.ListView1.Items.Add(item)
    45. End If
    46. For Each proc As Process In Process.GetProcesses
    47. If proc.MainWindowTitle <> "" Then
    48. If Not proc.MainWindowTitle = item Then
    49. Me.ListView2.Items.Add(proc.ProcessName).SubItems.Add(proc.WorkingSet64.ToString)
    50. End If
    51. End If
    52. Next
    53. Next
    54. Me.Label1.Text = Me.ListView1.Items.Count
    55. End Sub

    Visual Basic.NET 8o
    MS-SQL
    8o
    Du hast ne doppelte For-Schleife, die 1. beginnend bei Z#44, die 2. bei Z#48. Die laufenden Prozesse gehst Du also alle durch, und zwar sooft, wie es items in newwindowlist gibt. Hat newwindowlist also 10 Einträge, werden die Prozesse 10x im ListView2 auftauchen.
    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.
    @VaporiZed
    Du hattes recht, habe den Fehler nun gefunden und behoben.
    Habe gestern Abend, gar nicht mehr druchgeblickt.
    Aber jetzt ist es mir auch aufgefallen.
    Nochmals Vielen Dank! :thumbup:

    Die Lösung:

    VB.NET-Quellcode

    1. For Each item As String In newwindowlist
    2. If Not item = "Program Manager" Then
    3. Me.ListView1.Items.Add(item)
    4. End If
    5. Next
    6. For Each proc As Process In Process.GetProcesses
    7. If proc.MainWindowTitle <> "" Then
    8. Dim aa As New ListViewItem(proc.ProcessName)
    9. If Not Me.ListView2.Items.Contains(aa) Then
    10. Me.ListView2.Items.Add(proc.ProcessName).SubItems.Add(proc.WorkingSet64.ToString)
    11. End If
    12. End If
    13. Next
    Visual Basic.NET 8o
    MS-SQL
    8o