Jak symulować zdarzenia klawiatury (Windows Forms .NET)

Formularze systemu Windows udostępnia kilka opcji programowego symulowania danych wejściowych klawiatury. Ten artykuł zawiera omówienie tych opcji.

Korzystanie z SendKey

Formularze systemu Windows udostępnia klasę System.Windows.Forms.SendKeys do wysyłania naciśnięć do aktywnej aplikacji. Istnieją dwie metody wysyłania naciśnięć do aplikacji: SendKeys.Send i SendKeys.SendWait. Różnica między dwiema metodami polega na tym, że SendWait blokuje bieżący wątek, gdy naciśnięcie jest wysyłane, oczekiwanie na odpowiedź, a nie Send . Aby uzyskać więcej informacji na temat SendWaitprogramu , zobacz Aby wysłać naciśnięcie do innej aplikacji.

Uwaga

Jeśli aplikacja jest przeznaczona do użytku międzynarodowego z różnymi klawiaturami, użycie SendKeys.Send metody może przynieść nieprzewidywalne wyniki i należy unikać.

W tle SendKeys używa starszej implementacji systemu Windows do wysyłania danych wejściowych, co może zakończyć się niepowodzeniem w nowoczesnym systemie Windows, w którym oczekiwano, że aplikacja nie jest uruchomiona z prawami administracyjnymi. Jeśli starsza implementacja zakończy się niepowodzeniem, kod automatycznie podejmie próbę nowszej implementacji systemu Windows na potrzeby wysyłania danych wejściowych. Ponadto, gdy SendKeys klasa używa nowej implementacji, SendWait metoda nie blokuje już bieżącego wątku podczas wysyłania naciśnięć do innej aplikacji.

Ważne

Jeśli aplikacja opiera się na spójnym zachowaniu niezależnie od systemu operacyjnego, możesz wymusić SendKeys użycie nowej implementacji przez dodanie następującego ustawienia aplikacji do pliku app.config.

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

Aby wymusić SendKeys użycie tylko poprzedniej implementacji klasy, użyj tej wartości"JournalHook".

Aby wysłać naciśnięcie do tej samej aplikacji

Wywołaj metodę SendKeys.Send SendKeys or SendKeys.SendWait klasy . Określone naciśnięcia zostaną odebrane przez aktywną kontrolę aplikacji.

Poniższy przykład kodu używa Send metody do symulacji naciśnięcia ALT i DOWN razem. Te naciśnięcia powodują wyświetlanie listy rozwijanej ComboBox kontrolki. W tym przykładzie przyjęto założenie, że element Form z elementem i 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

Aby wysłać naciśnięcie do innej aplikacji

Metody SendKeys.Send i SendKeys.SendWait wysyłają naciśnięcia do aktywnej aplikacji, która zazwyczaj jest aplikacją, z której wysyłasz naciśnięcia. Aby wysłać naciśnięcia do innej aplikacji, najpierw musisz ją aktywować. Ponieważ nie ma metody zarządzanej do aktywowania innej aplikacji, należy użyć natywnych metod systemu Windows, aby skoncentrować inną aplikację. Poniższy przykład kodu używa wywołania platformy w celu wywołania FindWindow metody i SetForegroundWindow w celu aktywowania okna aplikacji Kalkulator, a następnie wywołuje wywołania Send w celu wystawienia serii obliczeń w aplikacji Kalkulator.

Poniższy przykład kodu używa Send metody do symulowania naciśnięcia w aplikacji Kalkulator systemu Windows 10. Najpierw wyszukuje okno aplikacji o tytule Calculator , a następnie aktywuje je. Po aktywowaniu naciśnięcia są wysyłane do obliczenia 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

Używanie metod OnEventName

Najprostszym sposobem symulowania zdarzeń klawiatury jest wywołanie metody na obiekcie, który zgłasza zdarzenie. Większość zdarzeń ma odpowiednią metodę, która je wywołuje, o nazwie we wzorcu On , po którym następuje EventNameciąg , na przykład OnKeyPress. Ta opcja jest możliwa tylko w ramach kontrolek niestandardowych lub formularzy, ponieważ te metody są chronione i nie można uzyskać do nich dostępu spoza kontekstu kontrolki lub formularza.

Te chronione metody są dostępne do symulowania zdarzeń klawiatury.

  • OnKeyDown
  • OnKeyPress
  • OnKeyUp

Aby uzyskać więcej informacji na temat tych zdarzeń, zobacz Używanie zdarzeń klawiatury (Windows Forms .NET).

Zobacz też