C’è un modo per integrare MS Office Smooth Typing in un’applicazione C #?

A mio parere, MS Office Smooth Typing è una funzionalità molto innovativa in Office Suite e vorrei sapere se questa funzione è disponibile per i programmatori in .NET Framework, in particolare nel linguaggio C #.

In tal caso, potresti inserire nella risposta un link alla documentazione e potrebbe anche essere un esempio di utilizzo ?

Grazie.

Non sono proprietario di Office, quindi non posso guardare la funzione, ma ho avuto bisogno di giocherellare con il caret in RichTextBoxes qualche tempo fa e ho deciso che non ne valeva la pena. Fondamentalmente sei da solo. Nessuna funzione di supporto da .NET, ma tutto viene gestito dal controllo Win32 di supporto. Avrai difficoltà a sconfiggere ciò che già accade sotto il cofano. E probabilmente finiscono per intercettare messaggi di windows e un sacco di codice brutto.

Quindi il mio consiglio di base è: non farlo. Almeno per i controlli di base dei moduli come TextBox o RichTextBox. Potresti avere più fortuna nel tentativo di accedere in remoto a un ufficio in esecuzione da .NET, ma è una lattina totalmente diversa dai worm.

Se insisti davvero ad andare su SetCaretPos – route, ecco un codice per farti funzionare con una versione base in cui puoi migliorare:

// import the functions (which are part of Win32 API - not .NET) [DllImport("user32.dll")] static extern bool SetCaretPos(int x, int y); [DllImport("user32.dll")] static extern Point GetCaretPos(out Point point); public Form1() { InitializeComponent(); // target position to animate towards Point targetCaretPos; GetCaretPos(out targetCaretPos); // richTextBox1 is some RichTextBox that I dragged on the form in the Designer richTextBox1.TextChanged += (s, e) => { // we need to capture the new position and restore to the old one Point temp; GetCaretPos(out temp); SetCaretPos(targetCaretPos.X, targetCaretPos.Y); targetCaretPos = temp; }; // Spawn a new thread that animates toward the new target position. Thread t = new Thread(() => { Point current = targetCaretPos; // current is the actual position within the current animation while (true) { if (current != targetCaretPos) { // The "30" is just some number to have a boundary when not animating // (eg when pressing enter). You can experiment with your own distances.. if (Math.Abs(current.X - targetCaretPos.X) + Math.Abs(current.Y - targetCaretPos.Y) > 30) current = targetCaretPos; // target too far. Just move there immediately else { current.X += Math.Sign(targetCaretPos.X - current.X); current.Y += Math.Sign(targetCaretPos.Y - current.Y); } // you need to invoke SetCaretPos on the thread which created the control! richTextBox1.Invoke((Action)(() => SetCaretPos(current.X, current.Y))); } // 7 is just some number I liked. The more, the slower. Thread.Sleep(7); } }); t.IsBackground = true; // The animation thread won't prevent the application from exiting. t.Start(); } 

Usa SetCaretPos con la tua funzione di temporizzazione dell’animazione. Crea un nuovo thread che interpola la posizione del cursore in base alla posizione precedente e alla nuova posizione desiderata.