Come simulare gli eventi della tastiera (Windows Form .NET)
Windows Form offre alcune opzioni per simulare l'input da tastiera a livello di codice. Questo articolo offre una panoramica di queste opzioni.
Usare SendKeys
Windows Form fornisce la classe per l'invio System.Windows.Forms.SendKeys di sequenze di tasti all'applicazione attiva. Esistono due metodi per inviare sequenze di tasti a un'applicazione: SendKeys.Send e SendKeys.SendWait. La differenza tra i due metodi consiste nel fatto che SendWait
blocca il thread corrente quando viene inviata la sequenza di tasti, in attesa di una risposta, mentre Send
non lo è. Per altre informazioni su SendWait
, vedere Per inviare una sequenza di tasti a un'applicazione diversa.
Attenzione
Se l'applicazione verrà usata a livello internazionale con un'ampia gamma di tastiere, è opportuno evitare l'uso di SendKeys.Send perché potrebbe generare risultati imprevedibili.
Dietro le quinte, SendKeys
usa un'implementazione di Windows precedente per l'invio di input, che potrebbe non riuscire in Windows moderno, in cui è previsto che l'applicazione non sia in esecuzione con diritti amministrativi. Se l'implementazione precedente ha esito negativo, il codice prova automaticamente l'implementazione di Windows più recente per l'invio di input. Inoltre, quando la SendKeys classe usa la nuova implementazione, il SendWait metodo non blocca più il thread corrente quando si inviano sequenze di tasti a un'altra applicazione.
Importante
Se l'applicazione si basa su un comportamento coerente indipendentemente dal sistema operativo, è possibile forzare la classe SendKeys a usare la nuova implementazione aggiungendo la seguente impostazione applicazione al file app.config.
<appSettings>
<add key="SendKeys" value="SendInput"/>
</appSettings>
Per forzare la SendKeys classe a usare solo l'implementazione precedente, usare invece il valore "JournalHook"
.
Per inviare una pressione di tasto alla stessa applicazione
Chiamare il metodo SendKeys.Send o SendKeys.SendWait della classe SendKeys . Le pressioni di tasti specificate verranno ricevute dal controllo attivo dell'applicazione.
Nell'esempio di codice seguente viene Send
usato per simulare la pressione dei tasti ALT e DOWN insieme. Queste sequenze di tasti determinano la visualizzazione dell'elenco a discesa del ComboBox controllo. In questo esempio si presuppone un Form oggetto con e Button ComboBox.
private void button1_Click(object sender, EventArgs e)
{
comboBox1.Focus();
SendKeys.Send("%+{DOWN}");
}
Private Sub Button1_Click(sender As Object, e As EventArgs)
ComboBox1.Focus()
SendKeys.Send("%+{DOWN}")
End Sub
Per inviare una pressione di tasto a un'applicazione diversa
I SendKeys.Send metodi e SendKeys.SendWait inviano le sequenze di tasti all'applicazione attiva, che in genere è l'applicazione da cui si inviano sequenze di tasti. Per inviare sequenze di tasti a un'altra applicazione, è prima necessario attivarla. Poiché non esiste alcun metodo gestito per attivare un'altra applicazione, è necessario usare i metodi nativi di Windows per concentrarsi sull'altra applicazione. Il seguente esempio di codice usa platform invoke per chiamare i metodi FindWindow
e SetForegroundWindow
per attivare la finestra dell'applicazione Calculator e quindi chiama Send
per inviare una serie di calcoli all'applicazione Calculator.
L'esempio di codice seguente usa Send
per simulare la pressione dei tasti nell'applicazione Calcolatrice di Windows 10. Cerca prima una finestra dell'applicazione con titolo e Calculator
quindi la attiva. Dopo l'attivazione, le sequenze di tasti vengono inviate per calcolare 10 più 10.
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
private void button1_Click(object sender, EventArgs e)
{
IntPtr calcWindow = FindWindow(null, "Calculator");
if (SetForegroundWindow(calcWindow))
SendKeys.Send("10{+}10=");
}
<Runtime.InteropServices.DllImport("USER32.DLL", CharSet:=Runtime.InteropServices.CharSet.Unicode)>
Public Shared Function FindWindow(lpClassName As String, lpWindowName As String) As IntPtr : End Function
<Runtime.InteropServices.DllImport("USER32.DLL")>
Public Shared Function SetForegroundWindow(hWnd As IntPtr) As Boolean : End Function
Private Sub Button1_Click(sender As Object, e As EventArgs)
Dim hCalcWindow As IntPtr = FindWindow(Nothing, "Calculator")
If SetForegroundWindow(hCalcWindow) Then
SendKeys.Send("10{+}10=")
End If
End Sub
Utilizzare i metodi OnEventName
Il modo più semplice per simulare gli eventi della tastiera consiste nel chiamare un metodo sull'oggetto che genera l'evento. La maggior parte degli eventi ha un metodo corrispondente che li richiama, denominato nel modello di On
seguito da EventName
, ad esempio OnKeyPress
. Questa opzione è possibile solo all'interno di controlli o moduli personalizzati, perché questi metodi sono protetti e non possono essere accessibili dall'esterno del contesto del controllo o del modulo.
Questi metodi protetti sono disponibili per simulare gli eventi della tastiera.
OnKeyDown
OnKeyPress
OnKeyUp
Per altre informazioni su questi eventi, vedere Uso degli eventi della tastiera (Windows Form .NET).
Vedi anche
.NET Desktop feedback