Dim cLong As Long
Dim astr As String * 256
AA = FindWindow("#32770", "替换")
bb = GetWindow(AA, GW_CHILD)
bb = GetWindow(bb, GW_HWNDNEXT)cLong = SendMessage(bb, WM_GETTEXTLENGTH, 0, vbNull)
 SendMessage bb, WM_GETTEXT, cLong + 1, astr
MsgBox astr用MSBBOX输出BB句柄的值和我用SPY++找到的EDIT句柄是一样的,但是如果输出astr就是空值,为什么不能得到EDIT框的值呢。

解决方案 »

  1.   

    先看看:
    SendMessage bb, WM_GETTEXT, cLong + 1, astr 是否执行成功
    (不知道你的sendmessage是怎么声明的,如果用默认声明的话,则应该改为:
    SendMessage bb, WM_GETTEXT, cLong + 1, byval astr)
    另外,由于你用了定长字符串,所以还要对结果做一下处理(提示一下:用left和instr)
      

  2.   

    SendMessage bb, WM_GETTEXT, cLong + 1, astr 是否执行成功,我看了一下返回值,为0,就是不成功喽我用的声明:
    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另外在ASTR前加了BYVAL 还是不管用。
      

  3.   

    这样试试:
    cLong = SendMessage(bb, WM_GETTEXTLENGTH, 0, byval 0&)
    dim buff(clong) as byte
    SendMessage bb, WM_GETTEXT, cLong + 1, buff(0)
    dim s as string
    s=strconv(buff,vbunicode)
    msgbox s另外,不建议使用clong这样的变量名称
      

  4.   

    试了,不过在dim buff(clong) as byte处说要求常数表达式
      

  5.   

    这样修改:
    dim buff() as byte
    redim buff(clong)
      

  6.   

    Private Sub Command1_Click()AA = FindWindow("#32770", "替换")
    bb = GetWindow(AA, GW_CHILD)
    bb = GetWindow(bb, GW_HWNDNEXT)Dim s As String
    Dim cLong As Byte
    Dim buff() As Byte
    ReDim buff(cLong)
    cLong = SendMessage(bb, WM_GETTEXTLENGTH, 0, ByVal 0&)SendMessage bb, WM_GETTEXT, cLong + 1, buff(0)s = StrConv(buff, vbUnicode)
    MsgBox clongEnd Sub
    还是不成功,查看CLONG的值为0,说明上面SendMessage(bb, WM_GETTEXTLENGTH, 0, ByVal 0&)没有成功,查看s的值也为空。对了我要获取的是记事本里面编辑菜单里的替换里的查找内容后面那个文本框的内容。
      

  7.   

    上面的Dim cLong As Byte本来是Dim cLong As long,我打错了,不过就算是 Dim cLong As long也不行
      

  8.   

    我测试了一下,应该是你获取的句柄有问题,用下面的方法吧:
    Option ExplicitPrivate Const WM_GETTEXT = &HDPrivate Const WM_GETTEXTLENGTH = &HEPrivate 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 FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function GetDlgItem Lib "user32" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long
    Private Sub Command1_Click()
        Dim mhwnd As Long
        mhwnd = FindWindow("#32770", "替换")
        If mhwnd = 0 Then Exit Sub
        mhwnd = GetDlgItem(mhwnd, &H481) '这个481是用spy看到的control id(16进制), 你的系统可能不一样
        Dim i As Long
        i = SendMessage(mhwnd, WM_GETTEXTLENGTH, 0, ByVal 0&)
        Dim buff() As Byte
        ReDim buff(i)
        i = SendMessage(mhwnd, WM_GETTEXT, i + 1, buff(0))
        MsgBox StrConv(buff, vbUnicode)
    End Sub
      

  9.   

    不好意思,我实在太菜。那个481用SPY在哪的找呢,又是找的什么控件得出的这个481呢
      

  10.   

    //不好意思,我实在太菜。那个481用SPY在哪的找呢,又是找的什么控件得出的这个481呢呵呵,用spy找控件句柄你应该会吧,找到句柄之后,点击"OK",会弹出一个对话框,对话框上有好几个选项卡,找到general选项卡,上面的control id 就是我们需要的