我的程序想把别人也是VB程序other.exe中的Text1.text的内容读到我的程序中,如何实现?我看了一下GetWindowText只能返回字符个数。

解决方案 »

  1.   

    '一个例子:
    '模块中:
    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。
      

  2.   

    回复了才看到 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
      

  3.   

    楼上的方法只可以取本程序内的文本框中的内容,不符合楼主要求。
    需要修改
    Private Sub Command2_Click()
    Print GetText(Text1.hwnd)
    End Sub
    这段代码。
    用findwindow和findwindowex可以获得其它程序某个控件的句柄。这样就可以用这个函数GetText了。
      

  4.   

    对于其它程序,最好是用spy++工具读出类名,结合窗口标题等信息,就可以定位一个外部程序里面某个控件的句柄
      

  5.   

    楼上的方法只可以取本程序内的文本框中的内容,不符合楼主要求。
    需要修改
    ======================
    我在第一次回帖时已说了:
    实际操作时,把你想要的other.exe中的Text1的句柄代替上面的Text1.hwnd。
      

  6.   

    我用
    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 要改成什么样子的恩?可以给我一个具体的格式的例子么?
      

  7.   

    我用
    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了,这样你就要在程序里实时捕捉它的句柄再代进去了,至于方法,我等一会儿贴上来。
      

  8.   

    下面是 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窗体下面一般控件的句柄了。。不过,在实际的应用中你可能还要对这些控件的类型、名字等做一些判断以确定是不是你要的那个控件方法大概就是这样了。