Condividi tramite


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