Поделиться через


Имитация событий клавиатуры

Windows Forms предоставляет несколько вариантов программного моделирования ввода клавиатуры. В этой статье представлен обзор этих параметров.

Используйте SendKeys

Windows Forms предоставляет System.Windows.Forms.SendKeys класс для отправки нажатий клавиш в активное приложение. Существует два метода отправки нажатий клавиш в приложение: SendKeys.Send и SendKeys.SendWait. Разница между двумя методами заключается в том, что SendWait блокируют текущий поток при отправке нажатия клавиш, ожидая ответа, в то время как Send это не так. Дополнительные сведения см. в SendWaitстатье "Отправка нажатия клавиш в другое приложение".

Осторожность

Если приложение предназначено для международного использования с различными клавиатурами, использование SendKeys.Send может привести к непредсказуемым результатам и следует избежать.

За кулисами SendKeys используется старая реализация Windows для отправки входных данных, которая может завершиться ошибкой в Windows, где ожидается, что приложение не работает с правами администратора. Если более старая реализация завершается ошибкой, код автоматически пытается использовать новую реализацию Windows для отправки входных данных. Кроме того, когда SendKeys класс использует новую реализацию, SendWait метод больше не блокирует текущий поток при отправке нажатий клавиш в другое приложение.

Это важно

Если приложение зависит от согласованного поведения независимо от операционной системы, вы можете принудительно принудить класс SendKeys использовать новую реализацию, добавив следующий параметр приложения в файл app.config.

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

Чтобы принудить SendKeys класс использовать только предыдущую реализацию, используйте вместо него значение "JournalHook" .

Отправка нажатия клавиш в то же приложение

Вызовите метод SendKeys.Send или SendKeys.SendWait класса SendKeys. Указанные нажатия клавиш получаются активным элементом управления приложением.

В следующем примере кода используется Send для имитации одновременного нажатия клавиш Alt и стрелка вниз. Эти нажатия клавиш приводят ComboBox к отображению раскрывающегося списка элемента управления. В этом примере предполагается Form с 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

Отправка нажатия клавиш в другое приложение

Методы SendKeys.SendSendKeys.SendWait отправляют нажатия клавиш в активное приложение, как правило, это приложение, из которого отправляются нажатия клавиш. Чтобы отправить нажатия клавиш в другое приложение, сначала необходимо активировать его. Так как для активации другого приложения нет управляемого метода, необходимо использовать собственные методы Windows для фокусировки другого приложения. В следующем примере кода используется вызов платформы для вызова методов FindWindow и SetForegroundWindow для активации окна приложения калькулятора, а затем вызывается Send для выдачи ряда вычислений приложению Калькулятора.

В следующем примере кода используется Send для имитации нажатия клавиш в приложении калькулятора Windows. Сначала он ищет окно приложения с заголовком Calculator , а затем активирует его. После активации нажатия клавиш отправляются, чтобы вычислить 10 плюс 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

Использование методов OnEventName

Самый простой способ имитации событий клавиатуры — вызвать метод для объекта, вызывающего событие. Большинство событий имеют соответствующий метод, который вызывает их, именуемый в шаблоне On , за которым следует EventName, например OnKeyPress. Этот параметр возможен только в пользовательских элементах управления или формах, так как эти методы защищены и не могут быть доступны вне контекста элемента управления или формы.

Эти защищенные методы доступны для имитации событий клавиатуры.

  • OnKeyDown
  • OnKeyPress
  • OnKeyUp

Дополнительные сведения об этих событиях см. в разделе "Использование событий клавиатуры".

См. также