Gestartete Programme auslesen und anzeigen

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von dauerproblem.

    Gestartete Programme auslesen und anzeigen

    Ich möchte alle gestarteten Programme (Powerpoint, Acrobat und weitere...) auslesen, in einer Combobox anzeigen und vom Benutzer ausgewählte Programme zeitgesteuert in einer bestimmten Reihenfolge in einer Endlosschlaufe mit "AppActivate" anzeigen lassen. Das Problem ist nun, wenn 2 Dateien in z.B. Acrobat geöffnet sind, bei der in meinem Code verwendeten Methode, der Acrobat nur 1 mal aufgeführt wird mit der zuletzt geöffneten Datei. Ich möchte aber dass das mit z.B. Acrobat geöffnete Dokument A und das Dokument B separat ausgelesen werden kann um diese auch einzeln bei Bedarf anzeigen zu lassen.

    Hier der Code zum Auslesen der Programme:

    VB.NET-Quellcode

    1. For Each p As Process In Process.GetProcesses
    2. If p.MainWindowTitle IsNot Nothing AndAlso p.MainWindowTitle <> String.Empty Then
    3. Me.cmbTask1.Items.Add(p.MainWindowTitle) : Me.cmbTask1.SelectedIndex = 0
    4. End If
    5. Next


    Über diesen Befehl wird das Programm dann angezeigt:

    VB.NET-Quellcode

    1. AppActivate(cmbTask1.SelectedItem)


    Währe super wenn mir jemand helfen könnte.
    Der Witz an dieser Angelegenheit ist, dass nur eine Acrobat-Instance geladen ist, eine MDI-Anwendung, diese aber mehrere MDI-Childs aktiv hat, diese aber separat in der Windows-Leiste angezeigt werden. Das ist bei manchen Office-Anwendungen auch so (Word, Excel), nicht aber Notepad++.
    Du musst also nach MDI-Child-Windows suchen.
    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!
    Der Tip mit der MDI-Form war goldrichtig.

    Hier der Schlüssel dazu:

    VB.NET-Quellcode

    1. Public Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As _
    2. EnumWindowsProc, ByVal lParam As Int32) As Int32Public Declare Function IsWindowVisible Lib "user32.dll" (ByVal hwnd As _
    3. IntPtr) As BooleanPublic Delegate Function EnumWindowsProc(ByVal hwnd As IntPtr, ByVal lParam _
    4. As Int32) As BooleanPublic Declare Function GetWindowText Lib "user32.dll" Alias _
    5. "GetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch _
    6. As Int32) As Int32Public Declare Function GetWindowTextLength Lib "user32.dll" Alias _
    7. "GetWindowTextLengthA" (ByVal hwnd As IntPtr) As Int32Public Declare Function GetWindowLong Lib "user32.dll" Alias _
    8. "GetWindowLongA" (ByVal hwnd As IntPtr, ByVal nIndex As Int32) As Int32Public Declare Function GetParent Lib "user32.dll" (ByVal intptr As IntPtr) _
    9. As IntPtrPublic Const GWL_HWNDPARENT As Int32 = -8
    10. Private newwindowlist As List(Of String)

    VB.NET-Quellcode

    1. Private Function EnumWinProc(ByVal hwnd As IntPtr, ByVal lParam As Int32) _
    2. As Boolean
    3. If IsWindowVisible(hwnd) Then
    4. If GetParent(hwnd) = IntPtr.Zero Then
    5. If GetWindowLong(hwnd, GWL_HWNDPARENT) = 0 ThenDim str As String = String.Empty.PadLeft( _
    6. GetWindowTextLength(hwnd) + 1)
    7. GetWindowText(hwnd, str, str.Length)If Not String.IsNullOrEmpty(str.Substring(0, str.Length - _1)) Then newwindowlist.Add(str.Substring(0, str.Length - _
    8. 1))
    9. End If
    10. End If
    11. End If
    12. EnumWinProc = TrueEnd Function

    VB.NET-Quellcode

    1. newwindowlist = New List(Of String)EnumWindows(AddressOf EnumWinProc, CInt(True))
    2. For Each item As String In newwindowlistMe.cmbTask1.Items.Add(item) : Me.cmbTask1.SelectedIndex = 0
    3. Me.cmbTask2.Items.Add(item) : Me.cmbTask2.SelectedIndex = 0Me.cmbTask3.Items.Add(item) : Me.cmbTask3.SelectedIndex = 0
    4. Me.cmbTask4.Items.Add(item) : Me.cmbTask4.SelectedIndex = 0Me.cmbTask5.Items.Add(item) : Me.cmbTask5.SelectedIndex = 0
    5. Me.cmbTask6.Items.Add(item) : Me.cmbTask6.SelectedIndex = 0Next

    Das wars.