7,763
社区成员
发帖
与我相关
我的任务
分享
'Example Name:EnumWindows and EnumChildWindows Callbacks
'------------------------------------------------------------------------------
'
' BAS Moduel Code
'
'------------------------------------------------------------------------------
Option Explicit
Private Const LVIF_INDENT As Long = &H10
Private Const LVIF_TEXT As Long = &H1
Private Const LVM_FIRST As Long = &H1000
Private Const LVM_SETITEM As Long = (LVM_FIRST + 6)
Private Type LVITEM
mask As Long
iItem As Long
iSubItem As Long
state As Long
stateMask As Long
pszText As String
cchTextMax As Long
iImage As Long
lParam As Long
iIndent As Long
End Type
Public Declare Function EnumWindows Lib "user32" _
(ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long
Public Declare Function EnumChildWindows Lib "user32" _
(ByVal hWndParent As Long, _
ByVal lpEnumFunc As Long, _
ByVal lParam 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 GetClassName Lib "user32" _
Alias "GetClassNameA" _
(ByVal hwnd As Long, _
ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long
Private Declare Function IsWindowVisible Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function GetParent Lib "user32" _
(ByVal hwnd As Long) As Long
Private 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 sIDType As String
Dim itmX As ListItem
Dim nodX As Node
'eliminate windows that are not top-level.
If GetParent(hwnd) = 0& And _
IsWindowVisible(hwnd) Then
'get the window title / class name
sTitle = GetWindowIdentification(hwnd, sIDType, sClass)
'add to the listview
Set itmX = Form1.ListView1.ListItems.Add(Text:=sTitle, Key:=CStr(hwnd) & "h")
itmX.SmallIcon = Form1.ImageList1.ListImages("parent").Key
itmX.SubItems(1) = CStr(hwnd)
itmX.SubItems(2) = sIDType
itmX.SubItems(3) = sClass
End If
'To continue enumeration, return True
'To stop enumeration return False (0).
'When 1 is returned, enumeration continues
'until there are no more windows left.
EnumWindowProc = 1
End Function
Private Function GetWindowIdentification(ByVal hwnd As Long, _
sIDType As String, _
sClass As String) As String
Dim nSize As Long
Dim sTitle As String
'get the size of the string required
'to hold the window title
nSize = GetWindowTextLength(hwnd)
'if the return is 0, there is no title
If nSize > 0 Then
sTitle = Space$(nSize + 1)
Call GetWindowText(hwnd, sTitle, nSize + 1)
sIDType = "title"
sClass = Space$(64)
Call GetClassName(hwnd, sClass, 64)
Else
'no title, so get the class name instead
sTitle = Space$(64)
Call GetClassName(hwnd, sTitle, 64)
sClass = sTitle
sIDType = "class"
End If
GetWindowIdentification = TrimNull(sTitle)
End Function
Public Function EnumChildProc(ByVal hwnd As Long, _
ByVal lParam As Long) As Long
'working vars
Dim sTitle As String
Dim sClass As String
Dim sIDType As String
Dim itmX As ListItem
'get the window title / class name
sTitle = GetWindowIdentification(hwnd, sIDType, sClass)
'add to the listview
Set itmX = Form2.ListView1.ListItems.Add(Text:=sTitle)
itmX.SmallIcon = Form2.ImageList1.ListImages("child").Key
itmX.SubItems(1) = CStr(hwnd)
itmX.SubItems(2) = sIDType
itmX.SubItems(3) = sClass
Listview_IndentItem Form2.ListView1.hwnd, CLng(itmX.Index), 1
EnumChildProc = 1
End Function
Private Function TrimNull(startstr As String) As String
Dim pos As Integer
pos = InStr(startstr, Chr$(0))
If pos Then
TrimNull = Left$(startstr, pos - 1)
Exit Function
End If
'if this far, there was
'no Chr$(0), so return the string
TrimNull = startstr
End Function
Private Sub Listview_IndentItem(hwnd As Long, _
nItem As Long, _
nIndent As Long)
Dim LV As LVITEM
'if nIndent indicates that indentation
'is requested nItem is the item to indent
If nIndent > 0 Then
With LV
.mask = LVIF_INDENT
.iItem = nItem - 1 'have to subtract 1
.iIndent = nIndent
End With
Call SendMessage(hwnd, LVM_SETITEM, 0&, LV)
End If
End Sub
'--end block--'
'------------------------------------------------------------------------------
'
' Form Code
'
'------------------------------------------------------------------------------
Option Explicit
Private Sub Command1_Click()
ListView1.ListItems.Clear
Call EnumWindows(AddressOf EnumWindowProc, &H0)
End Sub
Private Sub Form_Load()
Me.Move (Screen.Width - Me.Width) / 2, (Screen.Height - Me.Height) / 2
End Sub
Private Sub ListView1_DblClick()
Dim hwndSelected As Long
hwndSelected = Val(ListView1.SelectedItem.Key)
Load Form2
Call Form2.EnumSelectedWindow(ListView1.SelectedItem.Text, hwndSelected)
End Sub
'--end block--'
Form2 Code
Add the following code to Form2:
--------------------------------------------------------------------------------
Option Explicit
Public Sub EnumSelectedWindow(sItem As String, hwnd As Long)
ListView1.ListItems.Clear
ListView1.ListItems.Add Text:=sItem, SmallIcon:="parent"
Call EnumChildWindows(hwnd, AddressOf EnumChildProc, &H0)
Me.Show vbModal
End Sub
Private Sub Form_Load()
Me.Move (Screen.Width - Me.Width) / 2, (Screen.Height - Me.Height) / 2
End Sub
Option Explicit
Public Declare Function GetDesktopWindow Lib "user32.dll" () As Long
Public Declare Function EnumChildWindows Lib "user32.dll" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
'Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean
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 GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
Dim windowCaption As String, LengthCaption As Long
On Error Resume Next
LengthCaption = GetWindowTextLength(hwnd)
windowCaption = Space$(LengthCaption)
Call GetWindowText(hwnd, windowCaption, LengthCaption + 1)
Form1.List1.AddItem Str$(hwnd) & " " & windowCaption
EnumWindowsProc = True
End Function
'窗体Form1代码
Option Explicit
'窗体上添加一个命令按钮Command1,一个列表框List1
Private Sub Command1_Click()
Dim DeskTopHwnd As Long
DeskTopHwnd = GetDesktopWindow
EnumChildWindows DeskTopHwnd, AddressOf EnumWindowsProc, ByVal 0&
End Sub