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, ByVal lParam As Any) As Long
同步的解决, 先决条件是 你要指定的那个窗口类是 Edit 等可写入的才能同步更新'********获取该窗口的内容贴到本地的 Text1 Private Sub Command1_Click() Phwnd = FindWindow(vbNullString, "隔岸观火") If Phwnd <> 0 Then ChildHwnd = FindWindowEx(Phwnd, 0, "ThunderTextBox", vbNullString) If ChildHwnd > 0 Then Text1.Text = GetText(ChildHwnd) Call GetLine(ChildHwnd) End If End If End SubFunction GetText(THwnd As Long) As String TextLen = SendMessage(THwnd, WM_GETTEXTLENGTH, 0, 0) If TextLen = 0 Then GetText = "": Exit Function TextLen = TextLen + 1 TmpStr = Space(TextLen) TextLen = SendMessage(THwnd, WM_GETTEXT, TextLen, ByVal TmpStr) GetText = Left(TmpStr, TextLen) End Function '****************本地的 Text1 Change事件或点击按钮一次刷新指定窗口Private Sub Command2_Click() SendMessage ChildHwnd, WM_SETTEXT, 0, ByVal Text1.Text End Sub
如果单独跨进程去操作的话,LZ你可以看看下面的代码行不行,这个可以取得记事本编辑框的内容 Private Declare Function GetForegroundWindow& Lib "user32" () Private Declare Function GetCaretPos& Lib "user32" (ByVal XY As Long) Private Declare Function ClientToScreen& Lib "user32" (ByVal Hwnd As Long, ByVal XY As Long) Private Declare Function WindowFromPoint& Lib "user32" (ByVal X As Long, ByVal Y As Long) Private Declare Function GetClassName& Lib "user32" Alias "GetClassNameA" (ByVal Hwnd As Long, ByVal Buffer As String, ByVal Size As Long) Private Declare Function GetWindowText& Lib "user32" Alias "GetWindowTextA" (ByVal Hwnd As Long, ByVal Buffer As String, ByVal Size As Long) Private Declare Function SendMessageAny& Lib "user32" Alias "SendMessageA" (ByVal Hwnd As Long, ByVal Msg As Long, ByVal WParam As Long, LParam As Any)Private Sub Timer1_Timer() 'Timer周期100 Dim Hwnd&, XY&(1), Buffer As String * 260 Hwnd = GetForegroundWindow GetCaretPos VarPtr(XY(0)) ClientToScreen Hwnd, VarPtr(XY(0)) Hwnd = WindowFromPoint(XY(0), XY(1)) GetClassName Hwnd, Buffer, 260 Me.Caption = XY(0) & "," & XY(1) & "|" & Replace(Buffer, vbNullChar, vbNullString) End Sub 而如果想真正完美的SubClass的话,LZ可以开一个SetWindowsHookEx的全局钩子,注入DLL到那个进程中,然后枚举到那个文本框直接子类就行了,然后开一个内存文件或者油槽啥的和主进程通讯就行了
首先要得到其句柄
需要一堆API
找到文本框的句柄,然后
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
大侠,您说对了,这个问题其实挺复杂的,呵呵而且我还不知道我要监控的窗口到底是一种什么类型的窗口,我只知道能在里面输入内容,至于窗口的hwnd,大家就不要费心了,这个已经解决了
您的代码只能在自身进程内使用!我无法获取进程外其它进程中的输入框的光标位置和字符串谢谢您的回复。
Private Sub Command1_Click()
Phwnd = FindWindow(vbNullString, "隔岸观火")
If Phwnd <> 0 Then
ChildHwnd = FindWindowEx(Phwnd, 0, "ThunderTextBox", vbNullString)
If ChildHwnd > 0 Then
Text1.Text = GetText(ChildHwnd)
Call GetLine(ChildHwnd)
End If
End If
End SubFunction GetText(THwnd As Long) As String
TextLen = SendMessage(THwnd, WM_GETTEXTLENGTH, 0, 0)
If TextLen = 0 Then GetText = "": Exit Function
TextLen = TextLen + 1
TmpStr = Space(TextLen)
TextLen = SendMessage(THwnd, WM_GETTEXT, TextLen, ByVal TmpStr)
GetText = Left(TmpStr, TextLen)
End Function
'****************本地的 Text1 Change事件或点击按钮一次刷新指定窗口Private Sub Command2_Click()
SendMessage ChildHwnd, WM_SETTEXT, 0, ByVal Text1.Text
End Sub
类型不知道你可以用工具看看,比如Spy++
类型你都不知道还指望别人给出完整的代码?
Private Declare Function GetForegroundWindow& Lib "user32" ()
Private Declare Function GetCaretPos& Lib "user32" (ByVal XY As Long)
Private Declare Function ClientToScreen& Lib "user32" (ByVal Hwnd As Long, ByVal XY As Long)
Private Declare Function WindowFromPoint& Lib "user32" (ByVal X As Long, ByVal Y As Long)
Private Declare Function GetClassName& Lib "user32" Alias "GetClassNameA" (ByVal Hwnd As Long, ByVal Buffer As String, ByVal Size As Long)
Private Declare Function GetWindowText& Lib "user32" Alias "GetWindowTextA" (ByVal Hwnd As Long, ByVal Buffer As String, ByVal Size As Long)
Private Declare Function SendMessageAny& Lib "user32" Alias "SendMessageA" (ByVal Hwnd As Long, ByVal Msg As Long, ByVal WParam As Long, LParam As Any)Private Sub Timer1_Timer() 'Timer周期100
Dim Hwnd&, XY&(1), Buffer As String * 260
Hwnd = GetForegroundWindow
GetCaretPos VarPtr(XY(0))
ClientToScreen Hwnd, VarPtr(XY(0))
Hwnd = WindowFromPoint(XY(0), XY(1))
GetClassName Hwnd, Buffer, 260
Me.Caption = XY(0) & "," & XY(1) & "|" & Replace(Buffer, vbNullChar, vbNullString)
End Sub
而如果想真正完美的SubClass的话,LZ可以开一个SetWindowsHookEx的全局钩子,注入DLL到那个进程中,然后枚举到那个文本框直接子类就行了,然后开一个内存文件或者油槽啥的和主进程通讯就行了
2、GetWindowText和SendMessage均以失败告终;
3、在输入内容时,GetForegroundWindow获得值与其窗口的hwnd值并不相符
4、GetCaretPos可以获取光标的位置
5、WindowFromPoint可以使用
6、金山词霸可以取到其中的内容第一个目标已经实现了!!!!!获取光标的位置,它只是相对窗口的像素值,这个已经解决。下一个问题是:怎么得到那个窗口的的内容???????????????????我用GetWindowText和SendMessage都没有取到结果(这个有点类似屏幕取词的功能,哈哈。可是在网上搜索了一下,发现要用屏幕取词来实现,看来还是很麻烦的,而且,我也不会!)
各位大侠,还有什么方法可以获取某个窗口的(非标准Edit或RichEdit的窗口)的内容?
WindowFromPoint得到句柄
SendMessage得到内容
记得有一个免费的DLL将这个过程封装了,不过很多年没用过,忘了
给你提个醒,第一个看清楚你题意的人会做这个,贿赂他吧
PctGL大侠,好眼熟啊。不过这里的大侠,人品都很好的,有问必答啊,难道还需要贿赂吗?再说,我也不知道用什么去贿赂啊,请给点提示吧!!!!
另外:跨进程子类化,偶已经搞掂了(根据网上搜来的结果),我现在不知道怎么去获得那个窗口中的内容?????很着急!!!!!!!难道是监视那个窗口中输入的任何字符吗(通过跟踪发现这个过程很复杂!)???????
ReadProcessMemory
那个窗口可以找到固定的句柄,是一个名为Excel6的类名,但是我得到句柄后,不知怎么得到其中的内容,用sendmessage和getwindowtext都取不到内容(在DLL内,与excel属同一个进程)不知大侠有什么方法可以取到Excel6窗口的内容??