Dela via


Simulera tangentbordshändelser (Windows Forms .NET)

Windows Forms innehåller några alternativ för programmeringssimulering av tangentbordsindata. Den här artikeln innehåller en översikt över de här alternativen.

Använd SendKeys

Windows Forms tillhandahåller klassen System.Windows.Forms.SendKeys för att skicka tangenttryckningar till det aktiva programmet. Det finns två metoder för att skicka tangenttryckningar till ett program: SendKeys.Send och SendKeys.SendWait. Skillnaden mellan de två metoderna är att SendWait blockerar den aktuella tråden när tangenttryckningen skickas och väntar på ett svar, medan Send inte gör det. Mer information om SendWaitfinns i Så här skickar du en tangenttryckning till ett annat program.

Försiktighet

Om ditt program är avsett för internationell användning med en mängd olika tangentbord kan användningen av SendKeys.Send ge oförutsägbara resultat och bör undvikas.

I bakgrunden använder SendKeys en äldre Windows-implementering för att skicka indata, vilket kan misslyckas i moderna Windows där det förväntas att programmet inte körs med administrativa rättigheter. Om den äldre implementeringen misslyckas försöker koden automatiskt använda den nyare Windows-implementeringen för att skicka indata. När klassen SendKeys använder den nya implementeringen blockerar metoden SendWait inte längre den aktuella tråden när du skickar tangenttryckningar till ett annat program.

Viktig

Om ditt program förlitar sig på konsekvent beteende oavsett operativsystem kan du tvinga klassen SendKeys att använda den nya implementeringen genom att lägga till följande programinställning i din app.config-fil.

<appSettings>
  <add key="SendKeys" value="SendInput"/>
</appSettings>

Om du vill tvinga klassen SendKeys att endast använda föregående implementering använder du värdet "JournalHook" i stället.

Så här skickar du en tangenttryckning till samma program

Anropa metoden SendKeys.Send eller SendKeys.SendWait i klassen SendKeys. De angivna tangenttryckningarna tas emot av den aktiva kontrollen för programmet.

I följande kodexempel används Send för att simulera att trycka på ALT- och NEDÅT nycklar tillsammans. Dessa tangenttryckningar gör att ComboBox-kontrollen visar listrutan. Det här exemplet förutsätter en Form med en Button och 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

Så här skickar du en tangenttryckning till ett annat program

Metoderna SendKeys.Send och SendKeys.SendWait skickar tangenttryckningar till det aktiva programmet, vilket vanligtvis är det program som du skickar tangenttryckningar från. Om du vill skicka tangenttryckningar till ett annat program måste du först aktivera det. Eftersom det inte finns någon hanterad metod för att aktivera ett annat program måste du använda interna Windows-metoder för att fokusera det andra programmet. I följande kodexempel används plattformsanrop för att anropa metoderna FindWindow och SetForegroundWindow för att aktivera programfönstret Kalkylator och anropar sedan Send för att utfärda en serie beräkningar till kalkylatorprogrammet.

I följande kodexempel används Send för att simulera tangenttryckning i Windows 10 Calculator-programmet. Den söker först efter ett programfönster med rubriken Calculator och aktiverar det sedan. När tangenttryckningarna har aktiverats skickas de för att beräkna 10 plus 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

Använda OnEventName-metoder

Det enklaste sättet att simulera tangentbordshändelser är att anropa en metod för objektet som genererar händelsen. De flesta händelser har en motsvarande metod som anropar dem, med namnet i mönstret för On följt av EventName, till exempel OnKeyPress. Det här alternativet är endast möjligt i anpassade kontroller eller formulär, eftersom dessa metoder är skyddade och inte kan nås utanför kontexten för kontrollen eller formuläret.

Dessa skyddade metoder är tillgängliga för att simulera tangentbordshändelser.

  • OnKeyDown
  • OnKeyPress
  • OnKeyUp

Mer information om dessa händelser finns i Använda tangentbordshändelser (Windows Forms .NET).

Se även