Как я могу программно создать событие, которое имитировало бы нажатие клавиши на клавиатуре?
Как я могу программно создать событие, которое имитировало бы нажатие клавиши на клавиатуре?
Ответы:
Вопрос помечен как WPF, но пока ответы касаются конкретных WinForms и Win32.
Для этого в WPF просто создайте KeyEventArgs и вызовите RaiseEvent для цели. Например, чтобы отправить событие Insert key KeyDown текущему элементу с фокусом:
var key = Key.Insert; // Key to send
var target = Keyboard.FocusedElement; // Target element
var routedEvent = Keyboard.KeyDownEvent; // Event to send
target.RaiseEvent(
new KeyEventArgs(
Keyboard.PrimaryDevice,
PresentationSource.FromVisual(target),
0,
key)
{ RoutedEvent=routedEvent }
);
Это решение не полагается на собственные вызовы или внутренние компоненты Windows и должно быть намного надежнее других. Он также позволяет имитировать нажатие клавиши на определенном элементе.
Обратите внимание, что этот код применим только к событиям PreviewKeyDown, KeyDown, PreviewKeyUp и KeyUp. Если вы хотите отправлять события TextInput, вы сделаете это вместо этого:
var text = "Hello";
var target = Keyboard.FocusedElement;
var routedEvent = TextCompositionManager.TextInputEvent;
target.RaiseEvent(
new TextCompositionEventArgs(
InputManager.Current.PrimaryKeyboardDevice,
new TextComposition(InputManager.Current, target, text))
{ RoutedEvent = routedEvent }
);
Также обратите внимание, что:
Элементы управления ожидают получения событий предварительного просмотра, например PreviewKeyDown должен предшествовать KeyDown
Использование target.RaiseEvent (...) отправляет событие непосредственно в цель без метаобработки, такой как ускорители, композиция текста и IME. Обычно это то, что вы хотите. С другой стороны, если вы действительно делаете что-то для имитации реальных клавиш клавиатуры по какой-то причине, вы должны вместо этого использовать InputManager.ProcessInput ().
Keyboard.PrimaryDevice.ActiveSource
см stackoverflow.com/questions/10820990/...
Ctrl+C
)
Для создания ключевых событий без контекста Windows Forms мы можем использовать следующий метод,
[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
пример кода приведен ниже:
const int VK_UP = 0x26; //up key
const int VK_DOWN = 0x28; //down key
const int VK_LEFT = 0x25;
const int VK_RIGHT = 0x27;
const uint KEYEVENTF_KEYUP = 0x0002;
const uint KEYEVENTF_EXTENDEDKEY = 0x0001;
int press()
{
//Press the key
keybd_event((byte)VK_UP, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
return 0;
}
Список виртуальных ключей определяется здесь .
Чтобы получить полную картину, воспользуйтесь приведенной ниже ссылкой http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html
Я не использовал его, но SendKeys может делать то, что вы хотите.
Используйте SendKeys для отправки нажатий клавиш и комбинаций клавиш в активное приложение. Невозможно создать экземпляр этого класса. Чтобы отправить нажатие клавиши классу и немедленно продолжить выполнение программы, используйте Отправить. Чтобы дождаться каких-либо процессов, запущенных нажатием клавиши, используйте SendWait.
System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");
Microsoft имеет еще несколько примеров использования здесь .
Без труда! (потому что за нас уже работал кто-то другой ...)
Потратив много времени на попытки сделать это с предложенными ответами, я наткнулся на этот проект codeplex Windows Input Simulator, который упростил имитацию нажатия клавиши:
Установить пакет можно либо из диспетчера пакетов NuGet, либо из консоли диспетчера пакетов, например:
Инсталляционный пакет InputSimulator
Используйте эти 2 строки кода:
inputSimulator = new InputSimulator()
inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)
И это все!
-------РЕДАКТИРОВАТЬ--------
Страница проекта на codeplex по какой-то причине помечена, это ссылка на галерею NuGet.
Windows SendMessage API с отправкой WM_KEYDOWN .