Ottieni la posizione del cursore della casella di testo di winforms

Ottieni la posizione del cursore della casella di testo di winforms

Come già detto, il SelectionStart La proprietà non è affidabile per ottenere la posizione effettiva di CARET in un TextBox con una selezione attiva. Ciò è dovuto al fatto che questa proprietà punta sempre all'inizio della selezione (indizio:il nome non mente) e a seconda di come si seleziona il testo con il mouse il cursore potrebbe essere posizionato sul lato SINISTRO o DESTRO della selezione .

Questo codice (testato con LinqPAD) mostra un'alternativa

public class WinApi
{
    [DllImport("user32.dll")]
    public static extern bool GetCaretPos(out System.Drawing.Point lpPoint);
}

TextBox t = new TextBox();
void Main()
{
    Form f = new Form();
    f.Controls.Add(t);
    Button b = new Button();
    b.Dock = DockStyle.Bottom;
    b.Click += onClick;
    f.Controls.Add(b);
    f.ShowDialog();
}

// Define other methods and classes here
void onClick(object sender, EventArgs e)
{
    Console.WriteLine("Start:" + t.SelectionStart + " len:" +t.SelectionLength);
    Point p = new Point();
    bool result = WinApi.GetCaretPos(out p);
    Console.WriteLine(p);
    int idx = t.GetCharIndexFromPosition(p);
    Console.WriteLine(idx);
}

L'API GetCaretPos restituisce il punto nelle coordinate del cliente dove si trova il CARET. Puoi restituire l'indice del carattere dopo la posizione utilizzando il metodo gestito GetCharIndexFromPosition . Ovviamente devi aggiungere un riferimento e un using a System.Runtime.InteropServices .

Non sono sicuro che ci sia qualche inconveniente in questa soluzione e attendo se qualcuno più esperto può dirci se c'è qualcosa che non va o non c'è.