我要获当前窗体的一个控件(该控件没有提供内对象的坐标)中TextBox的绝对位置或者是这个Textbox中光标的位置也行。
GetCursorPos试过了,不行,从读出的值来看好象是光标在TextBox内的相对位置。
以下函数都试过了,救命啊!
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Public Declare Function GetCurrentPositionEx Lib "gdi32" (ByVal hdc As Long, lpPoint As POINTAPI) As Long
Public Declare Function GetCaretPos Lib "user32" (lpPoint As POINTAPI) As Long

解决方案 »

  1.   

    这个意思吗?'在form中放一个textBox两个labelConst EM_GETSEL = &HB0Const EM_LINEFROMCHAR = &HC9Const EM_LINEINDEX = &HBB
    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
    Public Sub GetCaretPos(ByVal hwnd5 As Long, LineNo As Long, ColNo As Long)Dim i As Long, j As LongDim lParam As Long, wParam As LongDim k As Longi = SendMessage(hwnd5, EM_GETSEL, wParam, lParam)j = i / 2 ^ 16 '取得目前Caret所在前面有多少个byteLineNo = SendMessage(hwnd5, EM_LINEFROMCHAR, j, 0) '取得前面有多少行LineNo = LineNo + 1k = SendMessage(hwnd5, EM_LINEINDEX, -1, 0)'取得目前caret所在行前面有多少个byteColNo = j - k + 1End Sub
    Private Sub Form_Load()Dim LineNo As Long, ColNo As Long
    Call GetCaretPos(Text1.hwnd, LineNo, ColNo)Label1.Caption = LineNoLabel2.Caption = ColNo
    End Sub
    Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)Dim LineNo As Long, ColNo As Long
    Call GetCaretPos(Text1.hwnd, LineNo, ColNo)Label1.Caption = LineNoLabel2.Caption = ColNo
    End Sub
    Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)Dim LineNo As Long, ColNo As Long
    Call GetCaretPos(Text1.hwnd, LineNo, ColNo)Label1.Caption = LineNoLabel2.Caption = ColNo
    End Sub
      

  2.   

    想要光标相对屏幕的位置吗?
    dim p as pointapi
    getcaretpos p
    clienttoscreen text1.hwnd, p
    此时p就是光标的绝对位置了。
      

  3.   

    '在form中放一个textBox两个label Const EM_GETSEL = &HB0 
    Const EM_LINEFROMCHAR = &HC9 
    Const EM_LINEINDEX = &HBB 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 Public Sub GetCaretPos(ByVal hwnd5 As Long, LineNo As Long, ColNo As Long) 
    Dim i As Long, j As Long 
    Dim lParam As Long, wParam As Long 
    Dim k As Long 
    i = SendMessage(hwnd5, EM_GETSEL, wParam, lParam) 
    j = i / 2 ^ 16 '取得目前Caret所在前面有多少个byte 
    LineNo = SendMessage(hwnd5, EM_LINEFROMCHAR, j, 0) '取得前面有多少行 
    LineNo = LineNo + 1 
    k = SendMessage(hwnd5, EM_LINEINDEX, -1, 0) 
    '取得目前caret所在行前面有多少个byte 
    ColNo = j - k + 1 
    End Sub 
    Private Sub Form_Load() 
    Dim LineNo As Long, ColNo As Long 
    Call GetCaretPos(Text1.hwnd, LineNo, ColNo) 
    Label1.Caption = LineNo 
    Label2.Caption = ColNo 
    End Sub 
    Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer) 
    Dim LineNo As Long, ColNo As Long 
    Call GetCaretPos(Text1.hwnd, LineNo, ColNo) 
    Label1.Caption = LineNo 
    Label2.Caption = ColNo 
    End Sub 
    Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) 
    Dim LineNo As Long, ColNo As Long 
    Call GetCaretPos(Text1.hwnd, LineNo, ColNo) 
    Label1.Caption = LineNo 
    Label2.Caption = ColNo 
    End Sub
    ==============================================================================================================
    '************************************************************
    '功能:取得TextBox、RichTextBox光标所在的行和列
    '支持中文,一个汉字算一列
    '************************************************************Option ExplicitPublic Const WM_USER = &H400
    Public Const EM_EXGETSEL = WM_USER + 52Public Const EM_LINEFROMCHAR = &HC9
    Public Const EM_LINEINDEX = &HBB
    Public Const EM_GETSEL = &HB0Public Type CHARRANGE
        cpMin As Long
        cpMax As Long
    End TypePublic Type POINTAPI
            x As Long
            y As Long
    End TypePublic Declare Function SendMessage Lib "user32" Alias _
            "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As _
            Long, ByVal wParam As Long, lParam As Any) As LongPublic Declare Sub CopyMemory Lib "kernel32" Alias _
            "RtlMoveMemory" (pDst As Any, pSrc As Any, _
            ByVal ByteLen As Long)
    '取得光标所在的行和列
    Public Function GetCurPos(ByRef TextControl As Control) As POINTAPI
        Dim LineIndex As Long
        Dim SelRange As CHARRANGE
        Dim TempStr As String
        Dim TempArray() As Byte
        Dim CurRow As Long
        Dim CurPos As POINTAPI    TempArray = StrConv(TextControl.Text, vbFromUnicode)    '取得当前被选中文本的位置 适用于 RichTextBox
        'TextControl 用 EM_GETSEL 消息
        Call SendMessage(TextControl.hWnd, EM_EXGETSEL, 0, SelRange)    '根据参数wParam指定的字符位置返回该字符所在的行号
        CurRow = SendMessage(TextControl.hWnd, EM_LINEFROMCHAR, SelRange.cpMin, 0)    '取得指定行第一个字符的位置
        LineIndex = SendMessage(TextControl.hWnd, EM_LINEINDEX, CurRow, 0)    If SelRange.cpMin = LineIndex Then
            GetCurPos.x = 1
        Else        TempStr = String(SelRange.cpMin - LineIndex, 13)        '复制当前行开始到选择文本开始的文本
            CopyMemory ByVal StrPtr(TempStr), ByVal StrPtr(TempArray) + LineIndex, SelRange.cpMin - LineIndex
            TempArray = TempStr        '删除无用的信息
            ReDim Preserve TempArray(SelRange.cpMin - LineIndex - 1)        '转换为 Unicode
            TempStr = StrConv(TempArray, vbUnicode)        GetCurPos.x = Len(TempStr) + 1
        End If
        GetCurPos.y = CurRow + 1
    End Functionhttp://b4018.xici.net(新任版主,欢迎光临。)
    提供:VB、VBA、Office二次开发免费技术支持;
    承接:各类项目开发,如MIS系统,WEB网站,中小型应用软件等等;CO.:Vansoft Workroom
    MSN:[email protected]
    Email:[email protected]
           [email protected]
    TEL:025-86685867(范,24H)
      

  4.   

    就是 ColdMooon(月光寒)所说的意思,问题是我的所谓的那个TEXTBox是在一个控件里面的啊,如果得到它的句柄呢。