在C#中获取文本框中光标所在位置

时间:2022-01-05 10:48:46
在C#中获取文本框中光标所在位置 

首先定义API函数

const   int  EM_GETSEL  =   0xB0 ;
const   int  EM_LINEFROMCHAR  =   0xC9 ;
const   int  EM_LINEINDEX  =   0xBB ;
[DllImport(
" user32.dll " , EntryPoint  =   " SendMessage " )]
public   static   extern   int  SendMessage(
    
int  hwnd,
    
int  wMsg,
    
int  wParam,
    
ref   int  lParam
);

 获取位置的函数

private  Point GetCursorPos( int  TextHwnd)
{
    
int  i  =   0 , j  =   0 , k  =   0 ;
    
int  lParam  =   0 , wParam  =   0 ;
    i 
=  SendMessage(TextHwnd, EM_GETSEL, wParam,  ref  lParam);
    j 
=  i  /   65536 ;
    
int  lineNo  =  SendMessage(TextHwnd, EM_LINEFROMCHAR, j,  ref  lParam)  +   1 ;
    k 
=  SendMessage(TextHwnd, EM_LINEINDEX,  - 1 ref  lParam);
    
int  colNo  =  j  -  k  +   1 ;
    Point ret 
=   new  Point(lineNo, colNo);
    
return  ret;
}

完整代码如下:

using  System;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Data;
using  System.Drawing;
using  System.Runtime.InteropServices;
using  System.Text;
using  System.Windows.Forms;

namespace  CSWin
{
    
public   partial   class  Form1 : Form
    {
        
const   int  EM_GETSEL  =   0xB0 ;
        
const   int  EM_LINEFROMCHAR  =   0xC9 ;
        
const   int  EM_LINEINDEX  =   0xBB ;
        [DllImport(
" user32.dll " , EntryPoint  =   " SendMessage " )]
        
public   static   extern   int  SendMessage(
            
int  hwnd,
            
int  wMsg,
            
int  wParam,
            
ref   int  lParam
        );
        
private  Point GetCursorPos( int  TextHwnd)
        {
            
int  i  =   0 , j  =   0 , k  =   0 ;
            
int  lParam  =   0 , wParam  =   0 ;
            i 
=  SendMessage(TextHwnd, EM_GETSEL, wParam,  ref  lParam);
            j 
=  i  /   65536 ;
            
int  lineNo  =  SendMessage(TextHwnd, EM_LINEFROMCHAR, j,  ref  lParam)  +   1 ;
            k 
=  SendMessage(TextHwnd, EM_LINEINDEX,  - 1 ref  lParam);
            
int  colNo  =  j  -  k  +   1 ;
            Point ret 
=   new  Point(lineNo, colNo);
            
return  ret;
        }
        
public  Form1()
        {
            InitializeComponent();
        }

        
private   void  button1_Click( object  sender, EventArgs e)
        {
            Point p 
=  GetCaretPos( this .textBox1.Handle.ToInt32());
            
this .label1.Text  =   string .Format( " Line:{0}, Col:{1} " , p.X, p.Y);
        }
    }
}