c# - 获取winforms文本框的光标位置

标签 c# .net winforms

如何获取 .NET 中 winforms 文本框的当前光标(插入符号)位置? SelectionStart 仅返回所选文本的开始(选择的左侧)。如果光标位于所选内容的右侧,则表示此值错误。


澄清一下:在 .NET TextBox 中,SelectionStart 指向所选内容的左侧,当插入符号位于所选内容的右侧时也是如此。这意味着在两张图片中,SelectionStart 都是 2,但插入符号位置在第一张图片中为 2,在右图中为 7。

enter image description here

最佳答案

如前所述,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/

相关文章:

c# - 寻找半小时向上/向下的时间选择器控制

c# - 每次使用 Moq 调用方法时,如何使 Mock 返回一个新列表

c++ - 关于windows窗体中多线程和后台工作线程的一些问题

c# - RDLC 导出到 Excel 以在括号中显示负数

c# - Asp.net Core IoC 类型工厂

c# - 如果没有 HttpContext 或 ActionContext,如何在 .net core 中构建 URL

.net - System.Net.WebClient.DownloadFile() 是否分块读取下载的文件?

c# - 我必须做什么才能访问我自己的公共(public)方法?

c# - 提高 TreeView 图标的图像质量?

c# - 使用 Json.Net 仅序列化选定的属性