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 SendWait
finns 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
.NET Desktop feedback