Ciao
Per nascondere il caret devi usare la funzione HideCaret, che importi dalla dll user32:
[DllImport("user32.dll")]
private static extern void HideCaret(IntPtr hWnd);
hWnd è l'handle della finestra che possiede il caret, quindi nel tuo caso la TextBox. Il caret deve essere nascosto dopo che la TextBox ha ricevuto lo stato attivo, altrimenti viene ricreato.
Per ottenere questo effetto crea una classe che derivi da TextBox, quindi esegui l'override del metodo WndProc, che notifica l'arrivo di messaggi. In questo metodo controlli che il messaggio inviato sia un SetFocus (codice messaggio 0x0007) e se è così, dopo aver elaborato il messaggio, nascondi il caret:
class TuaTextBox : TextBox
{
private const int WM_SETFOCUS = 0x0007;
[DllImport("user32.dll")]
private static extern void HideCaret(IntPtr hWnd);
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_SETFOCUS)
{
HideCaret(this.Handle);
}
}
}
Luca