用API:FindWindowdim Phwnd as long phwnd=findwindow("类名","窗口标题") 其中可以不填其中一个或都不填。phwnd=0表示无该窗体。否则phwnd=句柄 然后用FindWindowEx函数 '-------------- 具体的给你个取得QQ发送框数据,并发送文本的代码 '-------------Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private 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 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 Private Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Private Const EM_GETLINECOUNT = &HBA Private Const WM_GETTEXT = &HD Private Const WM_SETTEXT = &HC Private Const WM_GETTEXTLENGTH = &HE Dim hd As Long, chd As Long Private Sub Command1_Click() Dim tt$ BringWindowToTop hd SetForegroundWindow hd tt = Text1.Text SendMessage chd, WM_SETTEXT, 0, ByVal tt SendKeys "%S" End SubPrivate Sub Timer1_Timer() hd = FindWindow(vbNullString, "发送消息") If hd <> 0 Then chd = FindWindowEx(hd, 0, "EDIT", vbNullString) If SendMessage(chd, EM_GETLINECOUNT, 0, 0) <> 0 Then Me.Caption = "QQ SendBox hWnd = " & CStr(chd) Text1.Enabled = True: Command1.Enabled = True Text2.Text = GetText(chd) Else Me.Caption = "Can't find QQ SendBox" Text1.Enabled = False: Command1.Enabled = False Text2.Text = "" End If End Sub Public Function GetText(ByVal hWndNow As Long) As String '获取文本的子程序 On Error Resume Next Dim bArr() As Byte, bArr2() As Byte hLength = SendMessage(hWndNow, WM_GETTEXTLENGTH, 0, 0) If hLength > 0 Then ReDim bArr(hLength + 1) As Byte, bArr2(hLength - 1) As Byte Call CopyMemory(bArr(0), hLength, 2) Call SendMessage(hWndNow, WM_GETTEXT, hLength + 1, bArr(0)) Call CopyMemory(bArr2(0), bArr(0), hLength) GetText = StrConv(bArr2, vbUnicode) Else GetText = "" End If End Function'-------------------- 需要一个Command,一个timer
读取鼠标位置 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 设置鼠标位置 Public Declare Function SetCursorPos Lib "user32" Alias "SetCursorPos" (ByVal x As Long, ByVal y As Long) As Long '--活动窗口的句柄 Public Declare Function GetForegroundWindow Lib "user32" Alias "GetForegroundWindow" () As Long ‘查找指定窗口,返回句柄 Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 读取窗口内的文本 Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long '发WM_GETTEXT消息函数 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 Declare Sub RtlMoveMemory Lib "kernel32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long) Public hLength As Long Public bArr() As Byte, bArr2() As Byte Public Const WM_GETTEXT = &HD Public Const WM_GETTEXTLENGTH = &HE Public Type POINTAPI X As Long Y As Long End TypePublic Type RECT Left As Long Top As Long Right As Long Bottom As Long End TypePrivate Sub Timer1_Timer() Dim strCN As String * 200 Dim i As Long, strCS As String hNow222 = GetForegroundWindow '--活动窗口的句柄 hResult = GetCursorPos(Pos) hNow = WindowFromPoint(Pos.X, Pos.Y) hSet = SetCursorPos(Pos.X, Pos.Y) '防止获取自身文本 If hNow <> Text1.hwnd Then Text1.Text = "【 句柄:" & hNow &" 】" & _ vbCrLf & "内容: " & GetText(hNow) End If DoEvents End Sub
to wjq(b_wind) 在command_click中的这两个函数有什么用? BringWindowToTop hd SetForegroundWindow hd
to wjq(b_wind) 如果这个窗体里有多个文本框,如何顺序获得每个文本框的句柄并对其操作?
EnumWindows, FindWindow, EnumChildWindows
to zyb_8022(紫光) BringWindowToTop SetForegroundWindow 的作用都是使后面参数句柄的窗体取得焦点,即成为活动窗体。作用相同,也懒得去调一个了 '------------- 可以像 Ranma_True(乱马1/2(真)) 说的,枚举。但如果是你要修改的窗口是固定的,那么,你可以自己使用FindWindowEx函数,试,一层一层下去,直到,找到你需要的文本框。用法: Hwnd=FindWindowEx(父窗口句柄,上一个找到的(如文本框的)句柄,类(如:文本框:EDIT),类(可省,设为:VbNullstring))
to wjq(b_wind) 怎么找啊?我用其它程序看了一下该窗体和该窗体上文本框的句柄和类名,这个窗体上所有文本控件的类名都是edit,并且文本框内容为空时,怎么找到哪个是我想要的?具体意思是这样的,有个数据库中的各字段对应各窗体中的各文本框,怎么样把数据库中的各字段的内容放在相应的文本框中?因为是要把内容放入到另外一个不可修改的应用程序中去,所以不能用ado直接操作 又如何取得另外一个应用程序中toolbar中各按钮,并能控制执行想要执行的某个命令的按钮 请指教
to wjq(b_wind) 我现在用的是枚举的方法,可是用此方法还是无法知道当前得到的是不是我想要的那个文本框的内容
有个API函数叫getwindowtext可以获得句柄对应控件的文字呀
'用以下函数可以取得该文本框的文字,以进行判断。如果他们都是空的Goto Pro2 Public Function GetText(ByVal hWndNow As Long) As String '获取文本的子程序 On Error Resume Next Dim bArr() As Byte, bArr2() As Byte hLength = SendMessage(hWndNow, WM_GETTEXTLENGTH, 0, 0) If hLength > 0 Then ReDim bArr(hLength + 1) As Byte, bArr2(hLength - 1) As Byte Call CopyMemory(bArr(0), hLength, 2) Call SendMessage(hWndNow, WM_GETTEXT, hLength + 1, bArr(0)) Call CopyMemory(bArr2(0), bArr(0), hLength) GetText = StrConv(bArr2, vbUnicode) Else GetText = "" End If End Function 'Pro2: dim tt$ tt="设置点文字"'发送到你找的文本框里,这样识别。由于,他们的顺序是不变的,用这种方法确定好FindWindowEx找到文本框的顺序,就可以了 SendMessage chd, WM_SETTEXT, 0, ByVal tt
phwnd=findwindow("类名","窗口标题")
其中可以不填其中一个或都不填。phwnd=0表示无该窗体。否则phwnd=句柄
然后用FindWindowEx函数
'--------------
具体的给你个取得QQ发送框数据,并发送文本的代码
'-------------Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private 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
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
Private Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Const EM_GETLINECOUNT = &HBA
Private Const WM_GETTEXT = &HD
Private Const WM_SETTEXT = &HC
Private Const WM_GETTEXTLENGTH = &HE
Dim hd As Long, chd As Long
Private Sub Command1_Click()
Dim tt$
BringWindowToTop hd
SetForegroundWindow hd
tt = Text1.Text
SendMessage chd, WM_SETTEXT, 0, ByVal tt
SendKeys "%S"
End SubPrivate Sub Timer1_Timer()
hd = FindWindow(vbNullString, "发送消息")
If hd <> 0 Then
chd = FindWindowEx(hd, 0, "EDIT", vbNullString)
If SendMessage(chd, EM_GETLINECOUNT, 0, 0) <> 0 Then Me.Caption = "QQ SendBox hWnd = " & CStr(chd)
Text1.Enabled = True: Command1.Enabled = True
Text2.Text = GetText(chd)
Else
Me.Caption = "Can't find QQ SendBox"
Text1.Enabled = False: Command1.Enabled = False
Text2.Text = ""
End If
End Sub
Public Function GetText(ByVal hWndNow As Long) As String '获取文本的子程序
On Error Resume Next
Dim bArr() As Byte, bArr2() As Byte
hLength = SendMessage(hWndNow, WM_GETTEXTLENGTH, 0, 0)
If hLength > 0 Then
ReDim bArr(hLength + 1) As Byte, bArr2(hLength - 1) As Byte
Call CopyMemory(bArr(0), hLength, 2)
Call SendMessage(hWndNow, WM_GETTEXT, hLength + 1, bArr(0))
Call CopyMemory(bArr2(0), bArr(0), hLength)
GetText = StrConv(bArr2, vbUnicode)
Else
GetText = ""
End If
End Function'--------------------
需要一个Command,一个timer
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
设置鼠标位置
Public Declare Function SetCursorPos Lib "user32" Alias "SetCursorPos" (ByVal x As Long, ByVal y As Long) As Long
'--活动窗口的句柄
Public Declare Function GetForegroundWindow Lib "user32" Alias "GetForegroundWindow" () As Long
‘查找指定窗口,返回句柄
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
读取窗口内的文本
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
'发WM_GETTEXT消息函数
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 Declare Sub RtlMoveMemory Lib "kernel32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Public hLength As Long
Public bArr() As Byte, bArr2() As Byte
Public Const WM_GETTEXT = &HD
Public Const WM_GETTEXTLENGTH = &HE
Public Type POINTAPI
X As Long
Y As Long
End TypePublic Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End TypePrivate Sub Timer1_Timer()
Dim strCN As String * 200
Dim i As Long, strCS As String
hNow222 = GetForegroundWindow '--活动窗口的句柄
hResult = GetCursorPos(Pos)
hNow = WindowFromPoint(Pos.X, Pos.Y)
hSet = SetCursorPos(Pos.X, Pos.Y)
'防止获取自身文本
If hNow <> Text1.hwnd Then
Text1.Text = "【 句柄:" & hNow &" 】" & _
vbCrLf & "内容: " & GetText(hNow)
End If DoEvents
End Sub
在command_click中的这两个函数有什么用?
BringWindowToTop hd
SetForegroundWindow hd
如果这个窗体里有多个文本框,如何顺序获得每个文本框的句柄并对其操作?
BringWindowToTop
SetForegroundWindow
的作用都是使后面参数句柄的窗体取得焦点,即成为活动窗体。作用相同,也懒得去调一个了
'-------------
可以像 Ranma_True(乱马1/2(真)) 说的,枚举。但如果是你要修改的窗口是固定的,那么,你可以自己使用FindWindowEx函数,试,一层一层下去,直到,找到你需要的文本框。用法:
Hwnd=FindWindowEx(父窗口句柄,上一个找到的(如文本框的)句柄,类(如:文本框:EDIT),类(可省,设为:VbNullstring))
怎么找啊?我用其它程序看了一下该窗体和该窗体上文本框的句柄和类名,这个窗体上所有文本控件的类名都是edit,并且文本框内容为空时,怎么找到哪个是我想要的?具体意思是这样的,有个数据库中的各字段对应各窗体中的各文本框,怎么样把数据库中的各字段的内容放在相应的文本框中?因为是要把内容放入到另外一个不可修改的应用程序中去,所以不能用ado直接操作
又如何取得另外一个应用程序中toolbar中各按钮,并能控制执行想要执行的某个命令的按钮
请指教
我现在用的是枚举的方法,可是用此方法还是无法知道当前得到的是不是我想要的那个文本框的内容
Public Function GetText(ByVal hWndNow As Long) As String '获取文本的子程序
On Error Resume Next
Dim bArr() As Byte, bArr2() As Byte
hLength = SendMessage(hWndNow, WM_GETTEXTLENGTH, 0, 0)
If hLength > 0 Then
ReDim bArr(hLength + 1) As Byte, bArr2(hLength - 1) As Byte
Call CopyMemory(bArr(0), hLength, 2)
Call SendMessage(hWndNow, WM_GETTEXT, hLength + 1, bArr(0))
Call CopyMemory(bArr2(0), bArr(0), hLength)
GetText = StrConv(bArr2, vbUnicode)
Else
GetText = ""
End If
End Function
'Pro2:
dim tt$
tt="设置点文字"'发送到你找的文本框里,这样识别。由于,他们的顺序是不变的,用这种方法确定好FindWindowEx找到文本框的顺序,就可以了
SendMessage chd, WM_SETTEXT, 0, ByVal tt
请指教“我觉得可以先用Spy++看到他与窗体的从属关系(下属几层),然后用FindWindowEx区的其句柄。再用SendMessage发送点击消息。但是我不知道,如何点其中的某个按钮。或者可以这样,先取得toolbar句柄,用GetWindowRect取得位置,用API移动鼠标到那个按钮,然后模拟鼠标点击
最后再问一次,谢谢
那你知不知道模拟鼠标点击是哪个消息?另外为什么从文本框中取得的字符串无法与其它字符串变量相比较?比如从文本框中取得的字符串是"ABC",另一个字符串变量是A="ABC",为什么它们哪个不相等?
最后再问一次,谢谢
那你知不知道模拟鼠标点击是哪个消息?另外为什么从文本框中取得的字符串无法与其它字符串变量相比较?比如从文本框中取得的字符串是"ABC",另一个字符串变量是A="ABC",为什么它们哪个不相等?怎么比较两者才是相等的?
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
Private Const WM_LBUTTONDOWN = &H201
Private Const MK_LBUTTON = &H1
'------------
SendMessage Command2.hwnd, WM_MOUSEACTIVATE, MK_LBUTTON, 20020
其中20020是鼠标点击位置格式为x0y.
'------------------------
因为,你使用取得字符串,需要先给变量设置缓冲区,用CHR(0) 或 空格。大多数用前者,这时就要使用instr函数取得第一个chr(0)所在,并把后面的chr(0)全部去掉。这样才能使他与你的变量相等。'------------------------
这两天CSDN那么不稳定。开这个页面用了半个小时。你可以e-mail我。给你留言了。