Sdílet prostřednictvím


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

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žijte SendKeys

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 SendWaitnaleznete v tématu Odeslání stisknutí kláves do jiné aplikace.

Opatrnost

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á pro odesílání vstupu starší implementaci Windows, 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ž nezablokuje 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, aby třída SendKeys používala novou implementaci přidáním následujícího nastavení aplikace do app.config souboru.

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

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

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

Volejte metodu SendKeys.Send nebo SendKeys.SendWait třídy SendKeys. 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 klávesy. Tyto stisknutí kláves způsobují, že ovládací prvek ComboBox zobrazí rozevírací seznam. Tento příklad předpokládá Form s 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

Metody SendKeys.Send a SendKeys.SendWait 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á platformní volání metod FindWindow a SetForegroundWindow k aktivaci okna aplikace Kalkulačka a volání Send k provedení řady výpočtů v aplikaci Kalkulačka.

Následující příklad kódu používá Send k simulaci stisknutí kláves do aplikace Kalkulačka windows 10. Nejprve vyhledá okno aplikace s názvem Calculator a pak ho aktivuje. Jakmile je to aktivováno, stisknuté klávesy jsou odeslány 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šina událostí má odpovídající metodu, která je vyvolá, pojmenovanou podle vzoru On následovaného EventName, jako například OnKeyPress. 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 (Windows Forms .NET).

Viz také