代码:
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 Long Const WM_GETTEXT = &HD
 Const WM_GETTEXTLENGTH = &HE
 Dim a
 Dim GetIParam As Long
 Dim GetString As String * 255
Private Sub Command1_Click()
a = SendMessage(CLng(Text1.Text), WM_GETTEXTLENGTH, 0, 0)
SendMessage CLng(Text1.Text), WM_GETTEXT, a + 1, GetIParam
GetKeyNameText GetIParam, GetString, Len(GetString)
MsgBox GetString
End Sub
TEXTBOX里的内容是目标的句柄,我是填一个其它程序的控件句柄,句柄是正确的..
可为何要崩溃呢?是不是内存的权限问题?
望解答...

解决方案 »

  1.   

    关键在于你使用的是"一个其它程序的控件句柄",这种情况你应该使用GetWindowText
    Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
    Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long
    Private Sub Form_Activate()
        'KPD-Team 1998
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        Dim MyStr As String
        'Create a buffer
        MyStr = String(100, Chr$(0))
        'Get the windowtext
        GetWindowText Me.hwnd, MyStr, 100
        'strip the rest of buffer
        MyStr = Left$(MyStr, InStr(MyStr, Chr$(0)) - 1)
        'Triple the window's text
        MyStr = MyStr + MyStr + MyStr
        'Set the new window text
        SetWindowText Me.hwnd, MyStr
    End Sub
      

  2.   


    不是啊...是SendMessage那出的问题.....
    好像是读内存的权限不够...
      

  3.   

    sendmessage的声明有错,最后一个参数声明错了
      

  4.   

    不要死专牛角尖, 相信#1楼的话吧, 用GetWindowText是正确的选择!!!
      

  5.   

    搞那么复杂干啥?
    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
      

  6.   

    GetString 的长度始终是255。换算成实际的长度是:
    Debug.Print Len(Left$(GetString, InStr(GetString, Chr(0)) - 1))
      

  7.   

    谢谢#10楼,问题解决了..
    但是我想请教一个问题,就是:
    SendMessage CLng(Text1.Text), WM_GETTEXT, 255, ByVal GetString '255是缓冲区的长度中ByVal GetString 是ByVal,也就是说,为什么要传值而不是用(ByRef) GetString传地址...
    望解答~
      

  8.   

     要想把这个问题说清楚,估计得明天见了, 简单一句说就是, vb的字符串是两级地址,传值才是把字符串的真正地址给传过去,传值则是把1级地址传去,这样的话,对于 A 版api来讲,大多数情况下都会挂的
      

  9.   

    是PctGL他说了,LZ声明错了,要么使用Any在写代码的时候手动ByVal,要么最后一个参数就是byval as long
      

  10.   

    关于API的字符串问题看这个帖子
    http://topic.csdn.net/u/20090901/09/dddf35aa-7838-4415-85b2-222358422d81.html