Windows
offers VB programmers the 'EnumXXX' APIs providing callback data for specific tasks.
This page demonstrates using the EnumWindows() API to enumerate all
windows on the system, and populate a listbox with their class name, hwnd and window text if available.
I didn't get fancy in using the lParam member of the callback ... the
MSDN identifies it as "an application-defined value given in EnumWindows or EnumDesktopWindows". In the Font callback
example, we used this to pass the listbox to the callback for populating ... here we'll just refer to the listbox directly.
|
Option Explicit
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved.
' Some pages may also contain other copyrights by the author.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Distribution: You can freely use this code in your own
' applications, but you may not reproduce
' or publish this code on any web site,
' online service, or distribute as source
' on any media without express permission.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Const MAX_PATH As Long = 260
Public Const LB_SETTABSTOPS As Long = &H192
Public Declare Function EnumWindows Lib "user32" _
(ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long
Public Declare Function GetClassName Lib "user32" _
Alias "GetClassNameA" _
(ByVal hWnd As Long, _
ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long
Public Declare Function GetWindowText Lib "user32" _
Alias "GetWindowTextA" _
(ByVal hWnd As Long, _
ByVal lpString As String, _
ByVal cch As Long) As Long
Public Declare Function GetWindowTextLength Lib "user32" _
Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long
Public Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Public Function EnumWindowProc(ByVal hWnd As Long, _
ByVal lParam As Long) As Long
'working vars
Dim nSize As Long
Dim sTitle As String
Dim sClass As String
Dim pos As Integer
'set up the strings to receive the class and
'window text. You could use GetWindowTextLength,
'but I'll cheat and use MAX_PATH instead.
sTitle = Space$(MAX_PATH)
sClass = Space$(MAX_PATH)
Call GetClassName(hWnd, sClass, MAX_PATH)
Call GetWindowText(hWnd, sTitle, MAX_PATH)
'strip the trailing chr$(0)'s from the strings
'returned above and add the window data to the list
Form1.List1.AddItem TrimNull(sClass) & vbTab & _
hWnd & vbTab & TrimNull(sTitle)
'to continue enumeration, we must return True
'(in C that's 1). If we wanted to stop (perhaps
'using if this as a specialized FindWindow method,
'comparing a known class and title against the
'returned values, and a match was found, we'd need
'to return False (0) to stop enumeration. When 1 is
'returned, enumeration continues until there are no
'more windows left.
EnumWindowProc = 1
End Function
Private Function TrimNull(item As String)
'remove string before the terminating null(s)
Dim pos As Integer
pos = InStr(item, Chr$(0))
If pos Then
TrimNull = Left$(item, pos - 1)
Else
TrimNull = item
End If
End Function |
Option Explicit
Private Sub Form_Load()
ReDim TabArray(0 To 2) As Long
TabArray(0) = 0
TabArray(1) = -142
TabArray(2) = 154
'clear any existing tabs
Call SendMessage(List1.hWnd, LB_SETTABSTOPS, 0&, ByVal 0&)
'set list tabstops
Call SendMessage(List1.hWnd, LB_SETTABSTOPS, 3&, TabArray(0))
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Command1_Click()
List1.Clear
'enumerate the windows passing the AddressOf the
'callback function. This example doesn't use the
'lParam member.
Call EnumWindows(AddressOf EnumWindowProc, &H0)
'show the window count
Label1.Caption = List1.ListCount & " windows found."
End Sub |