Як я можу програмно створити подію, яка б імітувала натискання клавіші на клавіатурі?
Як я можу програмно створити подію, яка б імітувала натискання клавіші на клавіатурі?
Відповіді:
Питання позначено WPF, але відповіді поки що конкретні WinForms та Win32.
Для цього в WPF просто побудуйте KeyEventArgs та зателефонуйте на ціль RaiseEvent. Наприклад, щоб надіслати ключовий вигляд 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 має ще кілька прикладів використання тут .
Легко! (адже хтось уже зробив роботу за нас ...)
Провівши багато часу, намагаючись на це запропонувати відповіді, я натрапив на цей проект кодеклексу Windows Input Simulator, який спростив, як можна, імітувати клавішу:
Встановити пакет можна за допомогою менеджера пакунків NuGet або з консолі диспетчера пакунків:
Встановити-пакетний вхідний симулятор
Використовуйте цей 2 рядок коду:
inputSimulator = new InputSimulator()
inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)
І це все!
------- РЕДАКЦІЯ --------
Сторінка проекту в кодеплексі чомусь позначена, це посилання на галерею NuGet.
API SendMessage для Windows з відправленням WM_KEYDOWN .