如何获取 .NET 中 winforms 文本框的当前光标(插入符号)位置? SelectionStart 仅返回所选文本的开始(选择的左侧)。如果光标位于所选内容的右侧,则表示此值错误。
澄清一下:在 .NET TextBox 中,SelectionStart 指向所选内容的左侧,当插入符号位于所选内容的右侧时也是如此。这意味着在两张图片中,SelectionStart 都是 2,但插入符号位置在第一张图片中为 2,在右图中为 7。
最佳答案
如前所述,SelectionStart
属性无法可靠地获取具有事件选择的 TextBox 中的实际插入符号位置。这是因为此属性始终指向选择开始(提示:名称不会说谎),并且根据您使用鼠标选择文本的方式,插入符号可能位于选择的左侧或右侧.
此代码(使用 LinqPAD 测试)显示了替代方案
public class WinApi
{
[DllImport("user32.dll")]
public static extern bool GetCaretPos(out System.Drawing.Point lpPoint);
}
TextBox t = new TextBox();
void Main()
{
Form f = new Form();
f.Controls.Add(t);
Button b = new Button();
b.Dock = DockStyle.Bottom;
b.Click += onClick;
f.Controls.Add(b);
f.ShowDialog();
}
// Define other methods and classes here
void onClick(object sender, EventArgs e)
{
Console.WriteLine("Start:" + t.SelectionStart + " len:" +t.SelectionLength);
Point p = new Point();
bool result = WinApi.GetCaretPos(out p);
Console.WriteLine(p);
int idx = t.GetCharIndexFromPosition(p);
Console.WriteLine(idx);
}
API GetCaretPos
返回插入符所在的客户端坐标中的点。您可以使用托管方法 GetCharIndexFromPosition
返回位置后字符的索引。当然,您需要添加对 System.Runtime.InteropServices
的引用和使用。
不确定此解决方案是否存在缺点,如果有更专家可以告诉我们是否存在错误或 Unresolved 问题,请等待。
关于c# - 获取winforms文本框的光标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32067342/