以下代码可以枚举当前系统所有已打开窗口的标题栏名称。可经过测试发现始终枚举不到 IE 和 QQ 的窗口标题,甚至连记事本写字板的窗口标题都枚举不到。貌似有好多窗口都枚举不到,能枚举到的是一大堆在后台运行的程序窗口,可这些对我没用啊。请问以下代码有什么不对的地方吗?EnumWindows不是可以枚举到屏幕上所有的顶层窗口吗,可我的代码为什么枚举不到呢?Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam 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 Function EnumWndProc(ByVal lhWnd As Long, ByVal lParam As Long) As Long
Dim strWndTextBuff As String * 255&
Dim strWndHeading As String
Call GetWindowText(lhWnd, strWndTextBuff, 255&)
If (InStr(strWndTextBuff, Chr(0&)) > 0&) Then
strWndHeading = Left(strWndTextBuff, InStr(strWndTextBuff, Chr(0&)) - 1&)
Debug.Print strWndHeading
End If
EnumWndProc = True
End Function
Call EnumWindows(AddressOf EnumWndProc, 0&)
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Function EnumWndProc(ByVal lhWnd As Long, ByVal lParam As Long) As Long
Dim strWndTextBuff As String * 255&
Dim strWndHeading As String
Call GetWindowText(lhWnd, strWndTextBuff, 255&)
If (InStr(strWndTextBuff, Chr(0&)) > 0&) Then
strWndHeading = Left(strWndTextBuff, InStr(strWndTextBuff, Chr(0&)) - 1&)
Debug.Print strWndHeading
End If
EnumWndProc = True
End Function
Call EnumWindows(AddressOf EnumWndProc, 0&)
解决方案 »
- 求高手代写代码
- 加密的DLL文件。
- 在文本框里输入一维数组的值应该怎么实现?
- 请问哪里能够获得积分?想请教问题老是没有积分给回答问题的专家!
- 散分,工作正式从烟台调到青岛,同时纪念第一个.net项目完成,散了这100分还有100分。
- statusbar刷新的时候有闪动,该怎么解决。
- 如何实现vb调用数据库中的数据直接显示word的打印预览窗口
- MSHFlexGrid
- (我出45')急,怎样让treeview控件显示access的内容!打个比方,我的数据库中有两个字段,我想显示第一个字段的所有内容! 单击所显示的内容可以显示另一字段的内容.
- 通过execl获取网站数据
- 大佬们 关于 XML 文件的存储问题
- 希望高手能解答这个问题 关于 WIN 7 UAC
Dim lnghWnd As Long
Dim strWndClassBuff As String * 255
Dim strWndTextBuff As String * 255
lnghWnd = FindWindow("IEFrame", vbNullString)
Call GetClassName(lnghWnd, strWndClassBuff, 255)
Call GetWindowText(lnghWnd, strWndTextBuff, 255) Debug.Print strWndClassBuff
Debug.Print strWndTextBuff
End Sub
说来也怪,我顶楼的代码别人直接复制拿来测试就能正常或取到所有窗口的标题,甚至连QQ的标题也能获取到,但是在我机子上却不行。不过总算问题解决了,以下附上示例代码:
这个可以获得第一个IE窗口内所有页面选项卡的标题:Private Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) 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 Function EnumWndProc(ByVal hWnd As Long, ByVal lParam As Long) As Long
Dim lnghWnd As Long
Dim strWndClassBuff As String * 255
Dim strWndTextBuff As String * 255
Dim strWndHeading As String
Call GetClassName(hWnd, strWndClassBuff, Len(strWndClassBuff))
If (InStr(strWndClassBuff, vbNullChar) > 0&) Then
If Left(strWndClassBuff, InStr(strWndClassBuff, vbNullChar) - 1&) = "TabWindowClass" Then
strWndHeading = Left(strWndTextBuff, GetWindowText(hWnd, strWndTextBuff, Len(strWndTextBuff)))
Debug.Print strWndHeading
End If
End If
EnumWndProc = True
End Function
Private Sub Command1_Click()
Dim lnghWnd As Long
lnghWnd = FindWindow("IEFrame", vbNullString)
Call EnumChildWindows(lnghWnd, AddressOf EnumWndProc, 0&)
End Sub
而这个示例是使用GetWindow获得所有的窗口标题:Option Explicit
Private Declare Function GetDesktopWindow Lib "USER32" () As Long
Private Declare Function GetWindow Lib "USER32" (ByVal hwnd As Long, ByVal wCmd 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 IsWindowVisible Lib "USER32" (ByVal hwnd As Long) As Long
Private Const GW_CHILD = &H5
Private Const GW_HWNDNEXT = &H2Private Sub GetHandle()
Dim tmp As String
Dim wHwnd As Long
Dim lngProcID As Long
Dim strTitle As String * 255 '用来存储窗口的标题
wHwnd = GetDesktopWindow() '取得桌面窗口句柄
wHwnd = GetWindow(wHwnd, GW_CHILD) '取得桌面窗口的第一个子窗口
'通过循环来枚举所有的窗口
Do While wHwnd <> 0&
Call GetWindowText(wHwnd, strTitle, Len(strTitle)) '取得下一个窗口的标题
If Left$(strTitle, 1&) <> vbNullChar Then
tmp = Left$(strTitle, InStr(1&, strTitle, vbNullChar))
If IsWindowVisible(wHwnd) > 0& Then Form1.List1.AddItem tmp + " - " + Trim(Str(wHwnd))
End If
wHwnd = GetWindow(wHwnd, GW_HWNDNEXT) '继续取得下一个窗口
Loop
End Sub
Private Sub Command1_Click()
GetHandle
End Sub