Caret personalizado para WinForms TextBox

Estou desenvolvendo um aplicativo semelhante ao HyperTerminal em um aplicativo WinForms .Net 2.0. Eu tenho um TextBox multilinha em um painel em que você pode interagir com um dispositivo de hardware.

Meu cliente quer ter um Caret personalizado, um retângulo preenchido do tamanho de um espaço de caractere em vez da linha vertical que é por padrão.

Eu sei .net não fornece uma opção para fazer isso por padrão, mas deve haver alguma function do Windows para fazê-lo.

   

Suponha um formulário com uma checkbox de texto:

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 é a lista de funções de Caret nativo fornecidas pelo Windows que você pode usá-las para sua aplicação.

  [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-fonte @ src \ Bibliotecas \ ICSharpCode.TextEditor \ Project \ Src \ Gui \ Caret.cs

Eu usaria System.Drawing para desenhar um cursor personalizado (bitmap), talvez com um timer para deixá-lo piscar como outro cursor.

Obtenha a posição atual do Cursor em pixels e desenhe um bitmap sobre esse cursor. Pode ser difícil encontrar a posição correta, mas deve ser factível.

Dê uma olhada aqui para checkbox de texto desenhada pelo Proprietário em winforms.

Usar:

 richTextBoxConsole.GetPositionFromCharIndex(cursorPos) 

Ocultar o cursor normal e desenhar o seu próprio? Não testado, mas deve funcionar eu acho.