vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Schützen Sie Ihre Software vor Software-Piraterie - mit sevLock 1.0 DLL!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: System/Windows · Sonstiges   |   VB-Versionen: VB4, VB5, VB605.02.02
Alle laufenden Programme ermitteln

Dieses Beispiel ermittelt alle laufenden Programme und zeigt diese übersichtlich in einem ListView-Control an.

Autor:   Thomas BannertBewertung:     [ Jetzt bewerten ]Views:  84.598 
ohne HomepageSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Welche Anwendungen sind alles gestartet? Wie lauten die dazugehörigen TaskIDs bzw. Fenster-Handles? Welcher Text steht in den Titelzeilen?

All diese Fragen beantwortet unser heutiger Tipp.

Alles, was Sie zum Ausprobieren benötigen, ist eine Form, ein ListView-Control, ein CommandButton und ein Modul.

Beim Klicken auf den CommandButton wird die Windows Fensterliste durchlaufen und alle gefundenen Programme im ListView sauber angezeigt, natürlich mit Fenstertitel, TaskID und Fenster-Handle.

' Fensterliste ermitteln und anzeigen
Private Sub Command1_Click()
  GetWindowList ListView
End Sub

Sollen alle Fenster ermittelt werden, also auch diejenigen, die nicht direkt sichtbar sind, einfach im GetWindowList-Aufruf als zweiten Parameter False angeben.

Folgenden Code bitte in das Modul einfügen:

Option Explicit
 
' alle benötigten API's
Private Declare Function GetWindow Lib "user32" ( _
  ByVal hWnd As Long, _
  ByVal wCmd As Long) As Long
 
Private Declare Function GetWindowLong Lib "user32" _
  Alias "GetWindowLongA" ( _
  ByVal hWnd As Long, _
  ByVal wIndx As Long) As Long
 
Private Declare Function GetWindowTextLength Lib "user32" _
  Alias "GetWindowTextLengthA" ( _
  ByVal hWnd As Long) As Long
 
Private Declare Function GetWindowText Lib "user32" _
  Alias "GetWindowTextA" ( _
  ByVal hWnd As Long, _
  ByVal lpString As String, _
  ByVal cch As Long) As Long
 
Private Declare Function GetWindowThreadProcessId Lib "user32" ( _
  ByVal hWnd As Long, _
  lpdwProcessId As Long) As Long
 
Const GW_HWNDFIRST = 0
Const GW_HWNDLAST = 1
Const GW_HWNDNEXT = 2
Const GW_HWNDPREV = 3
Const GW_OWNER = 4
Const GW_CHILD = 5
Const GW_MAX = 5
 
Const GWL_STYLE = (-16)
 
Const WS_VISIBLE = &H10000000
Const WS_BORDER = &H800000
Public Function GetWindowList(oLSV As ListView, _
  Optional bVisible As Boolean = True)
 
  ' oLSV     - Ein beliebiges ListView, das die
  '            Informationen aufnehmen soll
  ' bVisible - Wenn True werden nur sichtbare Windows
  '             angezeigt, ansonsten alles
 
  Dim hWnd      As Long
  Dim sTitle    As String
  Dim lTaskID   As Long
  Dim lStyle    As Long
  Dim oListItem As ListItem
 
  ' ListView-Spalten festlegen
  With oLSV.ColumnHeaders
    .Clear
    .Add , "hWnd", "hWnd"
    .Add , "TaskID", "TaskID"
    .Add , "Visible", "Visible"
    .Add , "Title", "Title"
  End With
 
  ' Inhalt löschen und umschalten auf "Detail"-Ansicht
  oLSV.ListItems.Clear
  oLSV.View = lvwReport
 
  ' Erstes WindowHandle holen
  hWnd = GetWindow(oLSV.Parent.hWnd, GW_HWNDFIRST)
  Do
    ' Handle auswerten und im ListView eintragen
    lStyle = GetWindowLong(hWnd, GWL_STYLE)
    lStyle = lStyle And (WS_VISIBLE Or WS_BORDER)
    sTitle = GetWindowTitle(hWnd)
    lTaskID = GetWindowTaskID(hWnd)
 
    If (lStyle = (WS_VISIBLE Or WS_BORDER)) = bVisible Then
      ' in das ListView eintragen
      Set oListItem = oLSV.ListItems.Add(, , hWnd)
      With oListItem
        .SubItems(1) = lTaskID
        .SubItems(2) = lStyle = (WS_VISIBLE Or WS_BORDER)
        .SubItems(3) = sTitle
      End With
    End If
 
    ' Nächses Handle
    hWnd = GetWindow(hWnd, GW_HWNDNEXT)
  Loop Until hWnd = 0
End Function
Private Function GetWindowTaskID(ByVal hWnd As Long) _
  As Long
 
  ' Ermittelt die TaskID eines Windows anhand des
  ' Window Handle
 
  Dim lResult As Long
  Dim lTemp As Long
 
  lResult = GetWindowThreadProcessId(hWnd, lTemp)
  GetWindowTaskID = lTemp
End Function
Private Function GetWindowTitle(ByVal hWnd As Long) _
  As String
 
  ' Ermittelt den Namen eines Windows anhand des
  ' Window Handle
 
  Dim lResult As Long
  Dim sTemp As String
 
  lResult = GetWindowTextLength(hWnd) + 1
  sTemp = Space(lResult)
  lResult = GetWindowText(hWnd, sTemp, lResult)
  GetWindowTitle = Left(sTemp, Len(sTemp) - 1)
End Function

Und wenn Sie nun lediglich prüfen wollen, ob z.B. WinWord gestartet ist, können Sie dies folgendermassen tun:

Public Function WordIsRunning(oForm As Form) As Boolean
  ' Gibt True zurück, wenn Word geladen ist
  Dim hWnd As Long
  Dim sTitle As String
  Dim lStyle As Long
 
  WordIsRunning = False ' Ich alter Pessimist ;-)
 
  ' Erstes WindowHandle holen
  hWnd = GetWindow(oForm.hWnd, GW_HWNDFIRST)
 
  Do
    ' Handle auswerten
    lStyle = GetWindowLong(hWnd, GWL_STYLE)
    lStyle = lStyle And (WS_VISIBLE Or WS_BORDER)
 
    If (lStyle = (WS_VISIBLE Or WS_BORDER)) = True Then
      ' Titelzeile ermitteln und prüfen, ob
      ' das "Microsoft Word" darin enthalten ist
      sTitle = GetWindowTitle(hWnd)
      If InStr(1, sTitle, "Microsoft Word", _
        vbTextCompare) > 0 Then
        WordIsRunning = True
        Exit Do
      End If
    End If
    ' Nächses Handle
    hWnd = GetWindow(hWnd, GW_HWNDNEXT)
  Loop Until hWnd = 0
End Function

Dieser Tipp wurde bereits 84.598 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Aktuelle Diskussion anzeigen (2 Beiträge)

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel