本帖最后由 csorca 于 2011-02-22 16:35:58 编辑

解决方案 »

  1.   

    你的字符串 = replace(你的字符串, chr(0), "")
      

  2.   

     
    Public Function Gettext(ByVal hwnd As Long) As String
    On Error Resume Next
    Dim s As String
    Dim mlen As Long
    If hwnd = 0 Then Exit Function
    mlen = SendMessage(hwnd, WM_GETTEXTLENGTH, 0, vbNull)
              s = space(mlen + 1)
              Call SendMessage(hwnd, WM_GETTEXT, mlen + 1, s)
    Gettext = Left(s, InStr(s, Chr(0)) - 1)
    End Function
      

  3.   

    to 1楼为什么会这样, 是必须的, 还是有什么原因呢? 是VB的API取值问题吗? 能否给点深入的讲解, 谢谢to 2楼
    你的代码, 我一运行就会崩溃。。提示"0x770f4c94" 指令引用的 "0x74786550" 内存。该内存不能为 "read"。要终止程序,请单击“确定”。
    要调试程序,请单击“取消”。
      

  4.   

    3#你说的是第二段代码吗?  第二段代码是可以获得内容的, 就是最后面总是跟了个 chr(0)这个字符呀
      

  5.   

      Public Const WM_GETTEXTLENGTH = &HE
      

  6.   

    我已经明白了, 原来是最后一个参数声明错误3 # 老大, 头像好熟悉呀,,,难道EXCELHOME看过?引用你的另个帖子:Option Explicit
    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 GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As LongPrivate Const WM_GETTEXT = &HD&
    Private Const WM_GETTEXTLENGTH = &HE&
    'Dim a As Long
    Dim GetIParam As Long
    Dim GetString As String * 255
    Private Sub Command1_Click()
            Text1.Text = Command1.hwnd
            'a = SendMessage(CLng(Text1.Text), WM_GETTEXTLENGTH, 0, 0)
            SendMessage CLng(Text1.Text), WM_GETTEXT, 255, ByVal GetString '255是缓冲区的长度
            'GetKeyNameText GetIParam, GetString, Len(GetString)
            MsgBox GetString
    End Sub
      

  7.   


    Option Explicit
    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 GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As LongPrivate Const WM_GETTEXT = &HD&
    Private Const WM_GETTEXTLENGTH = &HE&
    'Dim a As Long
    Dim GetIParam As Long
    Dim GetString As String * 255
    Private Sub Command1_Click()
            Text1.Text = Command1.hwnd
            'a = SendMessage(CLng(Text1.Text), WM_GETTEXTLENGTH, 0, 0)
            SendMessage CLng(Text1.Text), WM_GETTEXT, 255, ByVal GetString '255是缓冲区的长度
            'GetKeyNameText GetIParam, GetString, Len(GetString)
            MsgBox GetString
    End Sub 
      

  8.   

    至于getWindowText得到的内容最后有chr(0)我就当是约定俗成好了
      

  9.   

    这个说来话长。饱含很复杂的机制。包括VB的string实现,双字节转换等等。简单地说,C语言的string,以一个空0作为字符串结尾。
      

  10.   

    定义成255是对的,用的时候长度加1,改成256,用来接收一个空字符chr(0)。
      

  11.   

    '转换成实际长度时,用变长字符串(不能用定长字符串)
    dim Reallen as string
    Reallen=left(GetString,instr(1,GetString,chr(0))-1)