在C#中获取文本框中光标所在位置
Posted Snowdust
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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
);
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;
}
{
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);
}
}
}
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);
}
}
}
以上是关于在C#中获取文本框中光标所在位置的主要内容,如果未能解决你的问题,请参考以下文章
获取textarea文本框所选字符光标位置索引,以及选中的文本值;textarea高度自适应,随着内容增加高度增加;获取输入框中的光标位置