這個問題來自論壇。
第一反應是SelectionStart屬性,結果發現在分方向選擇內容時返回錯誤值,真正答案如下:
using
System;
using
System.ComponentModel;
using
System.Windows.Forms;
using
System.Runtime.InteropServices;
using
System.Drawing;
namespace
WindowsApplication5
...
{
public
partial
class
Form1 : Form
...
{
public
Form1()
...
{
InitializeComponent();
}
[DllImport(
"
user32.dll
"
)]
private
static
extern
bool
GetCaretPos(
out
Point ppt);
private
void
Form1_Load(
object
sender, EventArgs e)
...
{
this
.textBox1.Text
=
"
jinjazz
"
;
}
private
void
Form1_MouseDown(
object
sender, MouseEventArgs e)
...
{
Point p;
GetCaretPos(
out
p);
int
i
=
this
.textBox1.GetCharIndexFromPosition(p);
this
.Text
=
i.ToString();
}
}
}
在zswang(偶最pf的伴水)的提醒下,上面方法存在兩個遺漏,zswang的補充如下:
1、當輸入焦點沒有在編輯框中(比如有多個輸入框),這樣游標的位置擷取並非指定。
當然可以考慮擷取之前先Focus()一下。
2、GetCharIndexFromPosition()方法有缺陷,當游標在最後一個字元來回的時候數值不變-_-!!!得完善一下。
public
virtual
int
GetCharIndexFromPosition(Point pt)
...
{
int
lParam
=
NativeMethods.Util.MAKELONG(pt.X, pt.Y);
int
n
=
(
int
) UnsafeNativeMethods.SendMessage(
new
HandleRef(
this
,
base
.Handle),
0xd7
,
0
, lParam);
//
EM_CHARFROMPOS = 0xd7
n
=
NativeMethods.Util.LOWORD(n);
if
(n
<
0
)
...
{
return
0
;
}
string
text
=
this
.Text;
if
(n
>=
text.Length)
...
{
n
=
Math.Max(text.Length
-
1
,
0
);
//
<<<<<<<
}
return
n;
}
感謝zswang!!!