在C#中获取文本框中光标所在位置
首先定义API函数
const
int
EM_GETSEL
=
0xB0
;
const
int
EM_LINEFROMCHAR
=
0xC9
;
const
int
EM_LINEINDEX
=
0xBB
;
[DllImport(
"
user32.dll
"
, EntryPoint
=
"
SendMessage
"
)]
public
static
extern
int
SendMessage(
int
hwnd,
int
wMsg,
int
wParam,
ref
int
lParam
);
获取位置的函数
private
Point GetCursorPos(
int
TextHwnd)
{
int
i
=
0
, j
=
0
, k
=
0
;
int
lParam
=
0
, wParam
=
0
;
i
=
SendMessage(TextHwnd, EM_GETSEL, wParam,
ref
lParam);
j
=
i
/
65536
;
int
lineNo
=
SendMessage(TextHwnd, EM_LINEFROMCHAR, j,
ref
lParam)
+
1
;
k
=
SendMessage(TextHwnd, EM_LINEINDEX,
-
1
,
ref
lParam);
int
colNo
=
j
-
k
+
1
;
Point ret
=
new
Point(lineNo, colNo);
return
ret;
}
完整代码如下:
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Runtime.InteropServices;
using
System.Text;
using
System.Windows.Forms;
namespace
CSWin
{
public
partial
class
Form1 : Form
{
const
int
EM_GETSEL
=
0xB0
;
const
int
EM_LINEFROMCHAR
=
0xC9
;
const
int
EM_LINEINDEX
=
0xBB
;
[DllImport(
"
user32.dll
"
, EntryPoint
=
"
SendMessage
"
)]
public
static
extern
int
SendMessage(
int
hwnd,
int
wMsg,
int
wParam,
ref
int
lParam
);
private
Point GetCursorPos(
int
TextHwnd)
{
int
i
=
0
, j
=
0
, k
=
0
;
int
lParam
=
0
, wParam
=
0
;
i
=
SendMessage(TextHwnd, EM_GETSEL, wParam,
ref
lParam);
j
=
i
/
65536
;
int
lineNo
=
SendMessage(TextHwnd, EM_LINEFROMCHAR, j,
ref
lParam)
+
1
;
k
=
SendMessage(TextHwnd, EM_LINEINDEX,
-
1
,
ref
lParam);
int
colNo
=
j
-
k
+
1
;
Point ret
=
new
Point(lineNo, colNo);
return
ret;
}
public
Form1()
{
InitializeComponent();
}
private
void
button1_Click(
object
sender, EventArgs e)
{
Point p
=
GetCaretPos(
this
.textBox1.Handle.ToInt32());
this
.label1.Text
=
string
.Format(
"
Line:{0}, Col:{1}
"
, p.X, p.Y);
}
}
}