wxy_xiaoyu你说的不错 但我现在用enumchildwindows +addressof依然遇到重重困难 Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As LongPrivate Sub Command3_Click() List2.Clear EnumChildWindows hwndrecv, AddressOf enumchildwindowspro, 0& End SubFunction enumchildwindowspro(ByVal hwnd As Long, ByVal lParam As Long) As Boolean Dim s As String Dim hwndrecv s = String(80, 0) hwndrecv = FindWindow(vbNullString, "test") Call GetWindowText(hwndrecv, s, 80) s = Left(s, InStr(s, Chr(0)) - 1) If Len(s) > 0 Then Form1.List2.AddItem s End If enumchildwindowspro = True End Function用上面的方法列举出来全是 test的标题 ,接下来GetClassInfo 该怎么用?
以下是EnumChildWindows 的例子'in a form Private Sub Form_Load() Me.AutoRedraw = True EnumChildWindows GetDesktopWindow, AddressOf EnumChildProc, ByVal 0& End Sub'''注意枚举函数一定要写在模块里! 'in a module Declare Function GetDesktopWindow Lib "user32" () As Long Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long Dim sSave As String 'Get the windowtext length sSave = Space$(GetWindowTextLength(hwnd) + 1) 'get the window text GetWindowText hwnd, sSave, Len(sSave) 'remove the last Chr$(0) sSave = Left$(sSave, Len(sSave) - 1) If sSave <> "" Then Form1.Print sSave 'continue enumeration EnumChildProc = 1 End Function
GetClassInfo 使用的句柄就是Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
GetClassInfo具体用法示例:Private Type WNDCLASS style As Long lpfnwndproc As Long cbClsextra As Long cbWndExtra2 As Long hInstance As Long hIcon As Long hCursor As Long hbrBackground As Long lpszMenuName As String lpszClassName As String End Type Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long Private Declare Function GetClassInfo Lib "user32" Alias "GetClassInfoA" (ByVal hInstance As Long, ByVal lpClassName As String, lpWndClass As WNDCLASS) As Long Private Sub Form_Paint() Dim WC As WNDCLASS 'Get class info GetClassInfo ByVal 0&, "BUTTON", WC 'Clear the form Me.Cls 'Print the retrieved information to the form Me.Print "The button's default background is set to color-number:" + Str$(GetSysColor(WC.hbrBackground)) End Sub===================================== 应该是可以网页上的文本框的建议楼主多看看帮助
Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
说明
在窗口列表中寻找与指定条件相符的第一个子窗口
返回值
Long,找到的窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError
参数表
参数 类型及说明
hWnd1 Long,在其中查找子的父窗口。如设为零,表示使用桌面窗口(通常说的顶级窗口都被认为是桌面的子窗口,所以也会对它们进行查找)
hWnd2 Long,从这个窗口后开始查找。这样便可利用对FindWindowEx的多次调用找到符合条件的所有子窗口。如设为零,表示从第一个子窗口开始搜索
lpsz1 String,欲搜索的类名。零表示忽略
lpsz2 String,欲搜索的类名。零表示忽略 我觉得仔细看应该能明白
2.用 EnumChildwindows + AddressOf 函数枚举所有子窗口
3.用 GetClassInfo 函数找到类名为“Edit”的窗口,就是你要的text
但我现在用enumchildwindows +addressof依然遇到重重困难 Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As LongPrivate Sub Command3_Click()
List2.Clear
EnumChildWindows hwndrecv, AddressOf enumchildwindowspro, 0&
End SubFunction enumchildwindowspro(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
Dim s As String
Dim hwndrecv
s = String(80, 0)
hwndrecv = FindWindow(vbNullString, "test")
Call GetWindowText(hwndrecv, s, 80)
s = Left(s, InStr(s, Chr(0)) - 1)
If Len(s) > 0 Then
Form1.List2.AddItem s
End If
enumchildwindowspro = True
End Function用上面的方法列举出来全是 test的标题 ,接下来GetClassInfo 该怎么用?
Private Sub Form_Load()
Me.AutoRedraw = True
EnumChildWindows GetDesktopWindow, AddressOf EnumChildProc, ByVal 0&
End Sub'''注意枚举函数一定要写在模块里!
'in a module
Declare Function GetDesktopWindow Lib "user32" () As Long
Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim sSave As String
'Get the windowtext length
sSave = Space$(GetWindowTextLength(hwnd) + 1)
'get the window text
GetWindowText hwnd, sSave, Len(sSave)
'remove the last Chr$(0)
sSave = Left$(sSave, Len(sSave) - 1)
If sSave <> "" Then Form1.Print sSave
'continue enumeration
EnumChildProc = 1
End Function
这个函数的第一个参数 hwnd所以当然是用在 该函数里面了
能给出一个实际例子吗? 用这样的方法能不能找到一个打开的网页中的文本框?兄弟们继续努力!
style As Long
lpfnwndproc As Long
cbClsextra As Long
cbWndExtra2 As Long
hInstance As Long
hIcon As Long
hCursor As Long
hbrBackground As Long
lpszMenuName As String
lpszClassName As String
End Type
Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
Private Declare Function GetClassInfo Lib "user32" Alias "GetClassInfoA" (ByVal hInstance As Long, ByVal lpClassName As String, lpWndClass As WNDCLASS) As Long
Private Sub Form_Paint()
Dim WC As WNDCLASS
'Get class info
GetClassInfo ByVal 0&, "BUTTON", WC
'Clear the form
Me.Cls
'Print the retrieved information to the form
Me.Print "The button's default background is set to color-number:" + Str$(GetSysColor(WC.hbrBackground))
End Sub=====================================
应该是可以网页上的文本框的建议楼主多看看帮助
,现在还有一个问题,就是接着发一个回车键该怎么发?现象: 如果接受数据的程序打开后焦点在其他文本框或控件上,发送消息并不能改变其焦点到我发送的文本框里来,这个也很正常。(被接受程序可能是最小化或者在桌面底部)。也就是说当激活数据接受程序时,发现数据已经到达响应文本框,可焦点可能还在原来他在的位置上。 因此,我怎么往我要发送的文本框里再发送一个回车消息,是不是中间还要夹 EN_SETFOCUS 消息,注意,数据接受程序不掉到最前面来,可能还是最小化状态。我用SendMessage 984552, WM_KEYDOWN, VK_RETURN, ByVal 0& 搞不定?还有我用GetClassName 结合鼠标移动来检测一个IE打开的网页时,页面全部为一个句柄号,这样以来就没有谈网页上哪个文本框的话题,是不是借助整个页面句柄结合发焦点tabs移动到我想要的文本框中?还是有整个页面句柄还有子窗体一说??????