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 LongConst EM_GETSEL = &HB0 Const EM_LINEFROMCHAR = &HC9 Const EM_LINEINDEX = &HBB' 获得文本框中光标的所在位置 ' hwnd 为文本框的句柄, LineNo 为光标所在的行数, ColNo 为光标所在的列数 Sub GetTextCursorPos(ByVal hwnd As Long, ByRef LineNo As Long, ByRef ColNo As Long) Dim i As Long, j As Long, k As Long Dim lParam As Long, wParam As Long i = SendMessage(hwnd, EM_GETSEL, wParam, lParam) j = i / 2 ^ 16 '取得目前光标前面有多少个字节 LineNo = SendMessage(hwnd, EM_LINEFROMCHAR, j, 0) '取得前面有多少行 LineNo = LineNo + 1 k = SendMessage(hwnd, EM_LINEINDEX, -1, 0) '取得目前光标所在行前面有多少个字节 ColNo = j - k + 1 End SubPrivate Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) Dim LineNo As Long, ColNo As Long GetTextCursorPos Text1.hwnd, LineNo, ColNo Debug.Print LineNo, ColNo End Sub
http://expert.csdn.net/Expert/topic/2250/2250384.xml?temp=.6102869
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongConst EM_GETSEL = &HB0
Const EM_LINEFROMCHAR = &HC9
Const EM_LINEINDEX = &HBB' 获得文本框中光标的所在位置
' hwnd 为文本框的句柄, LineNo 为光标所在的行数, ColNo 为光标所在的列数
Sub GetTextCursorPos(ByVal hwnd As Long, ByRef LineNo As Long, ByRef ColNo As Long)
Dim i As Long, j As Long, k As Long
Dim lParam As Long, wParam As Long
i = SendMessage(hwnd, EM_GETSEL, wParam, lParam)
j = i / 2 ^ 16 '取得目前光标前面有多少个字节
LineNo = SendMessage(hwnd, EM_LINEFROMCHAR, j, 0) '取得前面有多少行
LineNo = LineNo + 1
k = SendMessage(hwnd, EM_LINEINDEX, -1, 0) '取得目前光标所在行前面有多少个字节
ColNo = j - k + 1
End SubPrivate Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
Dim LineNo As Long, ColNo As Long
GetTextCursorPos Text1.hwnd, LineNo, ColNo
Debug.Print LineNo, ColNo
End Sub
(现在在网吧上网,没有MSDN,不好写代码)实时的获得就有点麻烦了(这是VB设计体系的问题),需要用SubClass技术处理编辑框的消息,在 键盘、鼠标、复制粘贴 消息处理后 重新度取 位置