'一个例子: '模块中: Option ExplicitPublic Const EM_GETLINECOUNT = &HBA Public Const EM_GETLINE = &HC4 Public Const EM_LINEINDEX = &HBB Public Const EM_LINELENGTH = &HC1Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Declare Sub RtlMoveMemory Lib "KERNEL32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)'程序中: Private Sub Command1_Click() Dim S As String, Length As Integer Dim LineCount As Long Dim i As Integer Dim re As String LineCount = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0, ByVal 0&) Length = 80
For i = 0 To LineCount S = String(Length, Chr(0)) RtlMoveMemory ByVal S, Length, 2 SendMessage Text1.hwnd, EM_GETLINE, i, ByVal S S = Left(S, InStr(S, Chr(0)) - 1) re = re + S + vbCrLf Next
Print re End SubPrivate Sub Form_Load() Text1.Text = "1" + vbCrLf + "2" + vbCrLf + "3" End Sub实际操作时,把你想要的other.exe中的Text1的句柄代替上面的Text1.hwnd。
回复了才看到 BitBlt(Raster Operater) 兄的回复。他的方法更好: 模块: Option Explicit Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Declare Sub RtlMoveMemory Lib "KERNEL32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long) Public Const WM_GETTEXTLENGTH = &HE Public Const WM_GETTEXT = &HD 程序: Private Sub Command2_Click() Print GetText(Text1.hwnd) End SubPrivate Sub Form_Load() Text1.Text = "1" + vbCrLf + "2" + vbCrLf + "3" End Sub Function GetText(ByVal hWndNow As Long) As String hLength = SendMessage(hWndNow, WM_GETTEXTLENGTH, 0, 0) If hLength > 0 Then ReDim bArr(hLength + 1) As Byte, bArr2(hLength - 1) As Byte Call RtlMoveMemory(bArr(0), hLength, 2) Call SendMessage(hWndNow, WM_GETTEXT, hLength + 1, bArr(0)) Call RtlMoveMemory(bArr2(0), bArr(0), hLength) GetText = StrConv(bArr2, vbUnicode) Else GetText = "" End If End Function
楼上的方法只可以取本程序内的文本框中的内容,不符合楼主要求。 需要修改 Private Sub Command2_Click() Print GetText(Text1.hwnd) End Sub 这段代码。 用findwindow和findwindowex可以获得其它程序某个控件的句柄。这样就可以用这个函数GetText了。
我用 hwnd = FindWindow(vbNullString, "Other") '假设other.exe的From1.caption=Other If (hwnd = 0) Then MsgBox "Window was not found!" Exit Sub End If是不是就获得了 other.exe的hwnd?带入您给我的程序代码shi什么样子的那?我反复几次没有成功.原来是LineCount = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0, ByVal 0&) 其中的 Text1.hwnd 要改成什么样子的恩?可以给我一个具体的格式的例子么?
我用 hwnd = FindWindow(vbNullString, "Other") '假设other.exe的From1.caption=Other If (hwnd = 0) Then MsgBox "Window was not found!" Exit Sub End If是不是就获得了 other.exe的hwnd?带入您给我的程序代码shi什么样子的那?我反复几次没有成功.原来是LineCount = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0, ByVal 0&) 其中的 Text1.hwnd 要改成什么样子的恩?可以给我一个具体的格式的例子么? 事后,我注册新号给您+分 ^_^ ============================================= 你得到的应该就是other窗体的句柄了,但一般来说,你得到这个句柄是没有用的,你应该得到的,是窗体里面控件的句柄例如,一个很简单的例子,你先自己做一个exe出来,这个exe只有一个窗体,名叫“other”,里面只有一个文本框,这个exe的代码很简单: Private Sub Form_Load() Text1.Text = Str(Text1.hWnd) End Su 把它生成exe,运行。。然后,你用你的方法去找找这个文本框的句柄,看是不是和text1里面的数字一样???如果是就对了,如果不是,就错了。。至于使用,作为试验,你可以把这个textbox里面的数字直接代入到另一个程序里去,例如,我在other里的textbox里看到的数字是“721446”,那么我另外一个程序的窗口代码就可以这样写看能不能实现预期目标: Private Sub Command2_Click() Print GetText(721446) End Sub Function GetText(ByVal hWndNow As Long) As String hLength = SendMessage(hWndNow, WM_GETTEXTLENGTH, 0, 0) If hLength > 0 Then ReDim bArr(hLength + 1) As Byte, bArr2(hLength - 1) As Byte Call RtlMoveMemory(bArr(0), hLength, 2) Call SendMessage(hWndNow, WM_GETTEXT, hLength + 1, bArr(0)) Call RtlMoveMemory(bArr2(0), bArr(0), hLength) GetText = StrConv(bArr2, vbUnicode) Else GetText = "" End If End Function可以看到,上面只是很简单的用721446代替了之前的text1.hwnd。。上面的代码在我这里运行的很正常。。当然,text1.hwnd每次运行的时候都不同,这次是721446,下次可能就是367876了,这样你就要在程序里实时捕捉它的句柄再代进去了,至于方法,我等一会儿贴上来。
下面是 TechnoFantasy(冰儿马甲www.applevb.com) ( ) 信誉:140 老大在另外一张贴的回复,你参考一下: ========================= 1、在工程中添加一个Module,代码: Option ExplicitPublic Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As _ Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As LongPublic Function EnumWindows_CBK(ByVal hWnd As Long, ByVal lParam As Long) As Long Form1.List1.AddItem Str(hWnd) EnumWindows_CBK = 1 End Function 2、在Form1中添加一个List控件,一个CommandButton控件以及其它控件,代码: Option ExplicitPrivate Sub Command1_Click() EnumChildWindows Me.hWnd, AddressOf EnumWindows_CBK, 1 End Sub运行程序,点击Command1,可以看到List1中列出全部控件的句柄。它上面的也是一个例子,只用了自己程序的form来做示范,你在实际操作中,只需要把你找到的other的句柄代进上面的me.hwnd,运行程序就可以看到other窗体下面一般控件的句柄了。。不过,在实际的应用中你可能还要对这些控件的类型、名字等做一些判断以确定是不是你要的那个控件方法大概就是这样了。
'模块中:
Option ExplicitPublic Const EM_GETLINECOUNT = &HBA
Public Const EM_GETLINE = &HC4
Public Const EM_LINEINDEX = &HBB
Public Const EM_LINELENGTH = &HC1Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Sub RtlMoveMemory Lib "KERNEL32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)'程序中:
Private Sub Command1_Click()
Dim S As String, Length As Integer
Dim LineCount As Long
Dim i As Integer
Dim re As String
LineCount = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0, ByVal 0&)
Length = 80
For i = 0 To LineCount
S = String(Length, Chr(0))
RtlMoveMemory ByVal S, Length, 2
SendMessage Text1.hwnd, EM_GETLINE, i, ByVal S
S = Left(S, InStr(S, Chr(0)) - 1)
re = re + S + vbCrLf
Next
Print re
End SubPrivate Sub Form_Load()
Text1.Text = "1" + vbCrLf + "2" + vbCrLf + "3"
End Sub实际操作时,把你想要的other.exe中的Text1的句柄代替上面的Text1.hwnd。
模块:
Option Explicit
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Sub RtlMoveMemory Lib "KERNEL32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Public Const WM_GETTEXTLENGTH = &HE
Public Const WM_GETTEXT = &HD
程序:
Private Sub Command2_Click()
Print GetText(Text1.hwnd)
End SubPrivate Sub Form_Load()
Text1.Text = "1" + vbCrLf + "2" + vbCrLf + "3"
End Sub
Function GetText(ByVal hWndNow As Long) As String
hLength = SendMessage(hWndNow, WM_GETTEXTLENGTH, 0, 0)
If hLength > 0 Then
ReDim bArr(hLength + 1) As Byte, bArr2(hLength - 1) As Byte
Call RtlMoveMemory(bArr(0), hLength, 2)
Call SendMessage(hWndNow, WM_GETTEXT, hLength + 1, bArr(0))
Call RtlMoveMemory(bArr2(0), bArr(0), hLength)
GetText = StrConv(bArr2, vbUnicode)
Else
GetText = ""
End If
End Function
需要修改
Private Sub Command2_Click()
Print GetText(Text1.hwnd)
End Sub
这段代码。
用findwindow和findwindowex可以获得其它程序某个控件的句柄。这样就可以用这个函数GetText了。
需要修改
======================
我在第一次回帖时已说了:
实际操作时,把你想要的other.exe中的Text1的句柄代替上面的Text1.hwnd。
hwnd = FindWindow(vbNullString, "Other") '假设other.exe的From1.caption=Other
If (hwnd = 0) Then
MsgBox "Window was not found!"
Exit Sub
End If是不是就获得了 other.exe的hwnd?带入您给我的程序代码shi什么样子的那?我反复几次没有成功.原来是LineCount = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0, ByVal 0&)
其中的 Text1.hwnd 要改成什么样子的恩?可以给我一个具体的格式的例子么?
hwnd = FindWindow(vbNullString, "Other") '假设other.exe的From1.caption=Other
If (hwnd = 0) Then
MsgBox "Window was not found!"
Exit Sub
End If是不是就获得了 other.exe的hwnd?带入您给我的程序代码shi什么样子的那?我反复几次没有成功.原来是LineCount = SendMessage(Text1.hwnd, EM_GETLINECOUNT, 0, ByVal 0&)
其中的 Text1.hwnd 要改成什么样子的恩?可以给我一个具体的格式的例子么?
事后,我注册新号给您+分 ^_^
=============================================
你得到的应该就是other窗体的句柄了,但一般来说,你得到这个句柄是没有用的,你应该得到的,是窗体里面控件的句柄例如,一个很简单的例子,你先自己做一个exe出来,这个exe只有一个窗体,名叫“other”,里面只有一个文本框,这个exe的代码很简单:
Private Sub Form_Load()
Text1.Text = Str(Text1.hWnd)
End Su
把它生成exe,运行。。然后,你用你的方法去找找这个文本框的句柄,看是不是和text1里面的数字一样???如果是就对了,如果不是,就错了。。至于使用,作为试验,你可以把这个textbox里面的数字直接代入到另一个程序里去,例如,我在other里的textbox里看到的数字是“721446”,那么我另外一个程序的窗口代码就可以这样写看能不能实现预期目标:
Private Sub Command2_Click()
Print GetText(721446)
End Sub
Function GetText(ByVal hWndNow As Long) As String
hLength = SendMessage(hWndNow, WM_GETTEXTLENGTH, 0, 0)
If hLength > 0 Then
ReDim bArr(hLength + 1) As Byte, bArr2(hLength - 1) As Byte
Call RtlMoveMemory(bArr(0), hLength, 2)
Call SendMessage(hWndNow, WM_GETTEXT, hLength + 1, bArr(0))
Call RtlMoveMemory(bArr2(0), bArr(0), hLength)
GetText = StrConv(bArr2, vbUnicode)
Else
GetText = ""
End If
End Function可以看到,上面只是很简单的用721446代替了之前的text1.hwnd。。上面的代码在我这里运行的很正常。。当然,text1.hwnd每次运行的时候都不同,这次是721446,下次可能就是367876了,这样你就要在程序里实时捕捉它的句柄再代进去了,至于方法,我等一会儿贴上来。
=========================
1、在工程中添加一个Module,代码:
Option ExplicitPublic Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As _
Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As LongPublic Function EnumWindows_CBK(ByVal hWnd As Long, ByVal lParam As Long) As Long
Form1.List1.AddItem Str(hWnd)
EnumWindows_CBK = 1
End Function
2、在Form1中添加一个List控件,一个CommandButton控件以及其它控件,代码:
Option ExplicitPrivate Sub Command1_Click()
EnumChildWindows Me.hWnd, AddressOf EnumWindows_CBK, 1
End Sub运行程序,点击Command1,可以看到List1中列出全部控件的句柄。它上面的也是一个例子,只用了自己程序的form来做示范,你在实际操作中,只需要把你找到的other的句柄代进上面的me.hwnd,运行程序就可以看到other窗体下面一般控件的句柄了。。不过,在实际的应用中你可能还要对这些控件的类型、名字等做一些判断以确定是不是你要的那个控件方法大概就是这样了。