Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Const EM_GETLINECOUNT = &HBApublic sub GetCaretpos(ByVal hwnd5 As Long, LineNo As Long, ColNo As Long)
 Dim i As Long
 i=sendmessage(hwnd5 ,GETLINECOUNT ,0,0)
end sub这是我在VBA中的代码,hwnd5 是我已经获得的TEXTBOX1的句柄,在VBA中执行上述代码不能够取得文本框中输入信息的行数,但是在VB中这段代码能够取得行数,所以我想问一下sendmessage函数在VBA中无效么?
请高手指点一下.谢谢了.

解决方案 »

  1.   

     SendMessage 最后一个参数前面加上 ByRef 。你把public 去掉,GetCaretpos 参数全改为 ByVal。
    再试一下看行不行!
      

  2.   

    i=sendmessage(hwnd5 ,EM_GETLINECOUNT ,0,0)
    另:你的text的句柄是如何得到的呢?用FindWindow吗?,(VBA功能沒有hWnd屬性,所以得靠 FindWindow 來取得handle value)
      

  3.   

    曾试过直接在VBA在引用SLEEP的(当然加上了引用的句子),可是却通不过,是不是不能在VBA中引用外来的API?????
      

  4.   

    Dim lCurHwnd     As Long
      Private Type POINTAPI
        x   As Long
        y   As Long
      End Type
      Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
      Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
      Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
      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
      
      Const EM_GETSEL = &HB0
      Const EM_LINEFROMCHAR = &HC9
      Const EM_LINEINDEX = &HBB
      Const EM_GETLINECOUNT = &HBA&Sub GetCaretPos(ByVal hwnd5 As Long, LineNo As Long, ColNo As Long)
      Dim i     As Long, j       As Long
      Dim k     As Long
      MsgBox "cccc:  " & hwnd5
      i = SendMessage(hwnd5, EM_GETLINECOUNT, 0, 0)
      MsgBox "bbbb:  " & i
    End Sub
    Private Sub CommandButton1_Click()
      Dim LineNo     As Long, ColNo       As Long
      MsgBox "aaaaa:  " & lCurHwnd
      Call GetCaretPos(lCurHwnd, LineNo, ColNo)
      Label1.Caption = LineNo
      Label2.Caption = ColNo
    End SubPrivate Sub TextBox1_Change()
      Dim PT_Mouse     As POINTAPI
      Dim lX     As Long, lY       As Long
        Call GetCursorPos(PT_Mouse)
        lX = PT_Mouse.x
        lY = PT_Mouse.y
        lCurHwnd = WindowFromPoint(lX, lY)
    End Sub
    这是我的全部代码,文本框句柄可以取到但是文本框行数取不到,I值是0.
      

  5.   

    这是因为vba里面的userform下的textbox的句柄是抓不到的。
    只能得到userform和包含其中的S3 server的句柄(你抓的是这个)
    所以不管textbox的情况如何,sendmessage并无法对它起作用
    当然也就抓不到。
    你还是自己用字符串来计算吧。
      

  6.   

    简单的方法是
    Private Sub CommandButton1_Click()
      TextBox1.SetFocus
      MsgBox (TextBox1.LineCount)
    End Sub