Sdílet prostřednictvím


Simulace událostí klávesnice (model Windows Forms .NET)

model Windows Forms nabízí několik možností pro programovou simulaci vstupu klávesnice. Tento článek obsahuje přehled těchto možností.

Použití SendKeys

model Windows Forms poskytuje System.Windows.Forms.SendKeys třídu pro odesílání stisknutí kláves do aktivní aplikace. Existují dvě metody odesílání stisknutí kláves do aplikace: SendKeys.Send a SendKeys.SendWait. Rozdíl mezi těmito dvěma metodami spočívá v tom, že SendWait blokuje aktuální vlákno při odeslání stisknutí klávesy, čekání na odpověď, zatímco Send ne. Další informace o SendWaitaplikaci naleznete v tématu Odeslání stisknutí klávesy do jiné aplikace.

Upozornění

Pokud je vaše aplikace určená pro mezinárodní použití s celou řadou klávesnic, může použití SendKeys.Send přinést nepředvídatelné výsledky a mělo by se jim vyhnout.

Na pozadí SendKeys používá starší implementaci Windows pro odesílání vstupu, která může selhat v moderním Systému Windows, kde se očekává, že aplikace není spuštěná s právy správce. Pokud starší implementace selže, kód se automaticky pokusí novější implementaci Systému Windows pro odesílání vstupu. Kromě toho, když SendKeys třída používá novou implementaci, SendWait metoda již neblokuje aktuální vlákno při odesílání stisknutí kláves do jiné aplikace.

Důležité

Pokud vaše aplikace spoléhá na konzistentní chování bez ohledu na operační systém, můžete vynutit SendKeys , aby třída používala novou implementaci přidáním následujícího nastavení aplikace do souboru app.config.

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

Chcete-li vynutit, SendKeys aby třída používala pouze předchozí implementaci, použijte místo toho hodnotu "JournalHook" .

Odeslání stisknutí klávesy do stejné aplikace

SendKeys.Send Volejte metodu nebo SendKeys.SendWait metodu SendKeys třídy. Zadané stisknutí kláves bude přijato aktivní kontrolou aplikace.

Následující příklad kódu používá Send k simulaci stisknutí kláves ALT a DOWN dohromady. Tyto stisknutí kláves způsobují, ComboBox že ovládací prvek zobrazí rozevírací seznam. Tento příklad předpokládá s Form a Button a 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

Odeslání stisknutí klávesy do jiné aplikace

SendKeys.SendWait Metody SendKeys.Send odesílají stisknutí kláves do aktivní aplikace, což je obvykle aplikace, ze které posíláte stisknutí kláves. Pokud chcete posílat stisknutí kláves do jiné aplikace, musíte ho nejdřív aktivovat. Vzhledem k tomu, že neexistuje žádná spravovaná metoda pro aktivaci jiné aplikace, musíte k zaměření druhé aplikace použít nativní metody Systému Windows. Následující příklad kódu používá volání FindWindow platformy volání a SetForegroundWindow metody k aktivaci okna aplikace Kalkulačka a volání Send k vydání řady výpočtů do aplikace Kalkulačka.

Následující příklad kódu používá Send k simulaci stisknutí kláves do aplikace Windows 10 Calculator. Nejprve vyhledá okno aplikace s názvem a aktivuje ho Calculator . Po aktivaci se klávesy odešlou k výpočtu 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

Použití metod OnEventName

Nejjednodušší způsob, jak simulovat události klávesnice, je volat metodu objektu, který vyvolá událost. Většinaudálostch On EventNameOnKeyPress Tato možnost je možná jenom v rámci vlastních ovládacích prvků nebo formulářů, protože tyto metody jsou chráněné a nelze k němu přistupovat mimo kontext ovládacího prvku nebo formuláře.

Tyto chráněné metody jsou k dispozici pro simulaci událostí klávesnice.

  • OnKeyDown
  • OnKeyPress
  • OnKeyUp

Další informace o těchto událostech najdete v tématu Použití událostí klávesnice (model Windows Forms .NET).

Viz také