Udostępnij przez


Jak symulować zdarzenia klawiatury

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

Korzystanie z SendKey

Windows Forms 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 w momencie wysyłania naciśnięcia klawisza, oczekując na odpowiedź, podczas gdy Send tego nie robi. Aby uzyskać więcej informacji na temat SendWait, zobacz Aby wysłać naciśnięcie do innej aplikacji.

Ostrzeżenie

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

W tle SendKeys używa starszej implementacji systemu Windows do wysyłania danych wejściowych, co może zakończyć się niepowodzeniem w 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 klasa SendKeys używa nowej implementacji, metoda SendWait 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ć użycie nowej implementacji klasy SendKeys przez dodanie następującego ustawienia aplikacji do pliku app.config.

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

Aby wymusić, aby klasa SendKeystylko używać poprzedniej implementacji, użyj wartości "JournalHook".

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

Wywołaj metodę SendKeys.Send lub SendKeys.SendWait klasy SendKeys. Określone naciśnięcia są odbierane przez aktywną kontrolę aplikacji.

Poniższy przykład kodu używa Send do symulowania naciśnięcia klawiszy Alt i strzałki w dół jednocześnie. Te naciśnięcia powodują wyświetlanie listy rozwijanej kontrolki ComboBox. W tym przykładzie zakłada się Form z Button i 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 klawisza 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 platformowego do wywoływania metod FindWindow i SetForegroundWindow w celu aktywowania okna aplikacji Kalkulator, a następnie wywołuje Send w celu wykonania serii obliczeń w aplikacji Kalkulator.

Poniższy przykład kodu używa Send do symulowania naciskania klawiszy w Kalkulatorze systemu Windows. Najpierw wyszukuje okno aplikacji z tytułem 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 a następnie EventName, 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.

Zobacz także