Caret personalizado para WinForms TextBox

Estoy desarrollando una aplicación tipo HyperTerminal personalizada en una aplicación WinForms .Net 2.0. Tengo un TextBox multilínea en un Panel en el que puedes interactuar con un dispositivo de hardware.

Mi cliente quiere tener un Caret personalizado, un rectángulo lleno del tamaño de un espacio de caracteres en lugar de la línea vertical que es por defecto.

Sé que .Net no proporciona una opción para hacer esto de forma predeterminada, pero debe haber alguna función de Windows para hacerlo.

Suponga un formulario con un cuadro de texto en él:

public partial class Form1 : Form { [DllImport("user32.dll")] static extern bool CreateCaret(IntPtr hWnd, IntPtr hBitmap, int nWidth, int nHeight); [DllImport("user32.dll")] static extern bool ShowCaret(IntPtr hWnd); public Form1() { InitializeComponent(); } private void Form1_Shown(object sender, EventArgs e) { CreateCaret(textBox1.Handle, IntPtr.Zero, 10, textBox1.Height); ShowCaret(textBox1.Handle); } } 

Esta es la lista de funciones de Native Caret proporcionada por Windows. Puede usarlas para su aplicación.

  [DllImport("User32.dll")] static extern bool CreateCaret(IntPtr hWnd, int hBitmap, int nWidth, int nHeight); [DllImport("User32.dll")] static extern bool SetCaretPos(int x, int y); [DllImport("User32.dll")] static extern bool DestroyCaret(); [DllImport("User32.dll")] static extern bool ShowCaret(IntPtr hWnd); [DllImport("User32.dll")] static extern bool HideCaret(IntPtr hWnd); 

Consulte SharpDevelop, Código fuente @ src \ Libraries \ ICSharpCode.TextEditor \ Project \ Src \ Gui \ Caret.cs

Yo usaría System.Drawing para dibujar un cursor personalizado (bitmap), tal vez con un temporizador para dejar que parpadee como otro cursor.

Obtenga la posición actual del Cursor en píxeles y dibuje un bitmap sobre ese cursor. Puede ser difícil encontrar la posición correcta, pero debería ser factible.

Eche un vistazo aquí al cuadro de texto dibujado por el propietario en winforms.

Utilizar:

 richTextBoxConsole.GetPositionFromCharIndex(cursorPos) 

¿Esconde el cursor normal y dibuja el tuyo? No probado, pero debería funcionar, creo.