如何获得TextBox里光标位置

这个问题来自论坛。

第一反应是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!!!

原文地址:https://www.cnblogs.com/cl1024cl/p/6204953.html