Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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
Дополнительные сведения об этих событиях см. в разделе "Использование событий клавиатуры".
См. также
.NET Desktop feedback