如何获得textBox里的光标位置

时间:2022-02-06 10:31:27
比如textBox.Text=“1234567”
选择“2345”这几个字符,光标可能在‘2’的前面,也可能在‘5’的后面,这个时候的selectionStart都等于1,所以无法判别光标究竟在哪里。

29 个解决方案

#1


参考c-sharpcorner这篇文章:   
  xConsole:   Extending   System.Console   Class   Functionality   
  http://www.c-sharpcorner.com/Code/2002/May/ExtendSysConsole.asp

#2


.....
比如textBox.Text=“1234567” 
选择“2345”这几个字符,光标可能在‘2’的前面,也可能在‘5’的后面,这个时候的selectionStart都等于1,所以无法判别光标究竟在哪里。


你到底要光标 还是字符下表?

#3


textBox.selectionStart=字符的位置

#4


变通的方法


using System;
using System.ComponentModel;
using System.Windows.Forms;
 
namespace WindowsApplication5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.textBox1.Text = "jinjazz";
        }
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            int i = this.textBox1.SelectionLength;
            this.textBox1.SelectionLength = 1;
            this.Text = this.textBox1.SelectionStart.ToString();
            this.textBox1.SelectionLength = i;
        }
    }
}

#5


顶一下,有空能不能讲一下,你做的这个小功能,感觉很有兴趣。

#6


如果TEXTBOX里边有字符选一组
text.selectionStart一定起点的位置

#7


mark一下看看

#8


selectionStart

#9


int start;
            this.textBox1.Focus();
            if (this.textBox1.SelectionLength > 0)
            {
                SendKeys.Send("{LEFT}"); 
                Application.DoEvents();
                start = this.textBox1.SelectionStart + 1;
            }
            else
                start = this.textBox1.SelectionStart ;
            this.textBox1.SelectionStart = start;
            this.label1.Text = start.ToString();

#10


引用 3 楼 meng_master 的回复:
textBox.selectionStart=字符的位置

是要光标的位置,不是选择字符的起始位置。
这两个概念是不同的。
winform里的textbox里的字符串,从左往右选,和从右往左选取同样的字符,selectionStart是相同的,但是光标位置不同,一个在最后面,另一个在最前面。

#11


不管从右往左还是从左往右,光标位置就是选择之后的位置,也就是选择之后光标位置是改变的

我上边的答案完全正确,你试试就知道了

#12


路过,楼主揭贴,收藏ing!!!!!!!!!

#13


这个功能有点意思
值得学习一下.

#14


引用 11 楼 jinjazz 的回复:
不管从右往左还是从左往右,光标位置就是选择之后的位置,也就是选择之后光标位置是改变的

我上边的答案完全正确,你试试就知道了

private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            int i = this.textBox1.SelectionLength;
            this.textBox1.SelectionLength = 0;                   //**************
            this.Text = this.textBox1.SelectionStart.ToString();
            //this.textBox1.SelectionLength = i;                 //**************
        }

你这么改一下,然后从左边往右选,这时光标在最后面,然后执行这个方法,前后的光标位置是不同的

#15


不好意思,前面理解错误,这么改

 private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            int i = this.textBox1.SelectionLength;
            this.textBox1.SelectionLength = 1;
            this.Text = (this.textBox1.SelectionStart+i).ToString();
            this.textBox1.SelectionLength = i;


        }

#16


引用 9 楼 h_w_king 的回复:
int start;this.textBox1.Focus();if(this.textBox1.SelectionLength>0)
            {
                SendKeys.Send("{LEFT}"); 
                Application.DoEvents();
                start=this.textBox1.SelectionStart+1;
            }elsestart=this.textBox1.SelectionStart ;this.textBox1.SelectionStart=start;this.label1.Text=start.ToString();

如果光标在textbox最左边,和光标在第一个字符后,得到的结果相同

#17


引用 15 楼 jinjazz 的回复:
不好意思,前面理解错误,这么改

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
int i = this.textBox1.SelectionLength;
this.textBox1.SelectionLength = 1;
this.Text = (this.textBox1.SelectionStart+i).ToString();
this.textBox1.SelectionLength = i;


}

这个还是同样的问题,从右往左选的时候,光标在最左边,可是这个方法之后,光标跑到右边去了

#18


引用 5 楼 zccmy22 的回复:
顶一下,有空能不能讲一下,你做的这个小功能,感觉很有兴趣。

我就是想获得光标的位置,但是如果选了文本框中的字符,那光标的位置就不好得到了

#19


完美解决

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();

        }
    }
}

#20


学习一下

#21


收藏了,LZ
如果实现了 麻烦把正解再详细的贴上来可以吗?

#22


再帮你顶顶。

#23


引用 19 楼 jinjazz 的回复:
完美解决

ok,就是它了

#24


 
int start;
            this.textBox1.Focus();
            if (this.textBox1.SelectionLength > 0)
            {
                start = this.textBox1.SelectionStart;
                int lenght=this.textBox1.SelectionLength;
                SendKeys.Send("+{RIGHT}");
                Application.DoEvents();
                if (this.textBox1.SelectionLength >= lenght)
                    start = start + lenght;


            }
            else
                start = this.textBox1.SelectionStart ;

            this.textBox1.SelectionStart = start;
            this.label1.Text = start.ToString();

#25


19楼的代码:
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;
}

#26


>>GetCharIndexFromPosition()方法有缺陷,当光标在最后一个字符来回的时候数值不变-_-!!!得完善一下。

汗...
这个是ms的问题?

#27


#28


int i = this.textBox1.SelectionLength;
            this.textBox1.SelectionLength = 1;
            this.Text = this.textBox1.SelectionStart.ToString();
            this.textBox1.SelectionLength = i;

#29


留印

#1


参考c-sharpcorner这篇文章:   
  xConsole:   Extending   System.Console   Class   Functionality   
  http://www.c-sharpcorner.com/Code/2002/May/ExtendSysConsole.asp

#2


.....
比如textBox.Text=“1234567” 
选择“2345”这几个字符,光标可能在‘2’的前面,也可能在‘5’的后面,这个时候的selectionStart都等于1,所以无法判别光标究竟在哪里。


你到底要光标 还是字符下表?

#3


textBox.selectionStart=字符的位置

#4


变通的方法


using System;
using System.ComponentModel;
using System.Windows.Forms;
 
namespace WindowsApplication5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.textBox1.Text = "jinjazz";
        }
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            int i = this.textBox1.SelectionLength;
            this.textBox1.SelectionLength = 1;
            this.Text = this.textBox1.SelectionStart.ToString();
            this.textBox1.SelectionLength = i;
        }
    }
}

#5


顶一下,有空能不能讲一下,你做的这个小功能,感觉很有兴趣。

#6


如果TEXTBOX里边有字符选一组
text.selectionStart一定起点的位置

#7


mark一下看看

#8


selectionStart

#9


int start;
            this.textBox1.Focus();
            if (this.textBox1.SelectionLength > 0)
            {
                SendKeys.Send("{LEFT}"); 
                Application.DoEvents();
                start = this.textBox1.SelectionStart + 1;
            }
            else
                start = this.textBox1.SelectionStart ;
            this.textBox1.SelectionStart = start;
            this.label1.Text = start.ToString();

#10


引用 3 楼 meng_master 的回复:
textBox.selectionStart=字符的位置

是要光标的位置,不是选择字符的起始位置。
这两个概念是不同的。
winform里的textbox里的字符串,从左往右选,和从右往左选取同样的字符,selectionStart是相同的,但是光标位置不同,一个在最后面,另一个在最前面。

#11


不管从右往左还是从左往右,光标位置就是选择之后的位置,也就是选择之后光标位置是改变的

我上边的答案完全正确,你试试就知道了

#12


路过,楼主揭贴,收藏ing!!!!!!!!!

#13


这个功能有点意思
值得学习一下.

#14


引用 11 楼 jinjazz 的回复:
不管从右往左还是从左往右,光标位置就是选择之后的位置,也就是选择之后光标位置是改变的

我上边的答案完全正确,你试试就知道了

private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            int i = this.textBox1.SelectionLength;
            this.textBox1.SelectionLength = 0;                   //**************
            this.Text = this.textBox1.SelectionStart.ToString();
            //this.textBox1.SelectionLength = i;                 //**************
        }

你这么改一下,然后从左边往右选,这时光标在最后面,然后执行这个方法,前后的光标位置是不同的

#15


不好意思,前面理解错误,这么改

 private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            int i = this.textBox1.SelectionLength;
            this.textBox1.SelectionLength = 1;
            this.Text = (this.textBox1.SelectionStart+i).ToString();
            this.textBox1.SelectionLength = i;


        }

#16


引用 9 楼 h_w_king 的回复:
int start;this.textBox1.Focus();if(this.textBox1.SelectionLength>0)
            {
                SendKeys.Send("{LEFT}"); 
                Application.DoEvents();
                start=this.textBox1.SelectionStart+1;
            }elsestart=this.textBox1.SelectionStart ;this.textBox1.SelectionStart=start;this.label1.Text=start.ToString();

如果光标在textbox最左边,和光标在第一个字符后,得到的结果相同

#17


引用 15 楼 jinjazz 的回复:
不好意思,前面理解错误,这么改

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
int i = this.textBox1.SelectionLength;
this.textBox1.SelectionLength = 1;
this.Text = (this.textBox1.SelectionStart+i).ToString();
this.textBox1.SelectionLength = i;


}

这个还是同样的问题,从右往左选的时候,光标在最左边,可是这个方法之后,光标跑到右边去了

#18


引用 5 楼 zccmy22 的回复:
顶一下,有空能不能讲一下,你做的这个小功能,感觉很有兴趣。

我就是想获得光标的位置,但是如果选了文本框中的字符,那光标的位置就不好得到了

#19


完美解决

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();

        }
    }
}

#20


学习一下

#21


收藏了,LZ
如果实现了 麻烦把正解再详细的贴上来可以吗?

#22


再帮你顶顶。

#23


引用 19 楼 jinjazz 的回复:
完美解决

ok,就是它了

#24


 
int start;
            this.textBox1.Focus();
            if (this.textBox1.SelectionLength > 0)
            {
                start = this.textBox1.SelectionStart;
                int lenght=this.textBox1.SelectionLength;
                SendKeys.Send("+{RIGHT}");
                Application.DoEvents();
                if (this.textBox1.SelectionLength >= lenght)
                    start = start + lenght;


            }
            else
                start = this.textBox1.SelectionStart ;

            this.textBox1.SelectionStart = start;
            this.label1.Text = start.ToString();

#25


19楼的代码:
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;
}

#26


>>GetCharIndexFromPosition()方法有缺陷,当光标在最后一个字符来回的时候数值不变-_-!!!得完善一下。

汗...
这个是ms的问题?

#27


#28


int i = this.textBox1.SelectionLength;
            this.textBox1.SelectionLength = 1;
            this.Text = this.textBox1.SelectionStart.ToString();
            this.textBox1.SelectionLength = i;

#29


留印