Я использую следующий проект для обработки глобальных подключений клавиатуры и мыши в моем Приложение С#.
Этот проект в основном представляет собой оболочку вызова Win API SetWindowsHookEx с использованием констант WH_MOUSE_LL или WH_KEYBOARD_LL. Он также управляет определенным состоянием и, как правило, делает этот вид подключения довольно безболезненным.
Я использую это для программного обеспечения для распознавания жестов мыши, над которым я работаю. По сути, я настроил его таким образом, что он определяет, когда нажата глобальная горячая клавиша (скажем, CTRL), затем пользователь перемещает мышь в форме заранее определенного жеста, а затем отпускает глобальную горячую клавишу.
Событие для KeyDown обрабатывается и говорит моей программе начать запись местоположений мыши, пока не получит событие KeyUp. Это работает нормально и позволяет пользователям легко входить в режим жестов мышью. Как только событие KeyUp срабатывает и обнаруживает соответствующий жест, предполагается, что в активное окно отправляются определенные нажатия клавиш, которые пользователь определил для этого конкретного жеста, который он только что нарисовал.
Я использую методы SendKeys.Send/SendWait для отправки вывода в текущее окно.
Моя проблема заключается в следующем: когда пользователь отпускает свою глобальную горячую клавишу (скажем, CTRL), он запускает событие KeyUp. Моя программа берет записанные точки мыши, определяет соответствующий жест и пытается отправить правильный ввод через SendKeys.
Однако, поскольку все это находится в событии KeyUp, эта глобальная горячая клавиша не закончила обработку. Так, например, если я определил жест для отправки клавиши «A» при ее обнаружении, а моя глобальная горячая клавиша — CTRL, при ее обнаружении SendKeys отправит «A», но пока CTRL все еще «нажат». Итак, вместо того, чтобы просто отправить A, я получаю CTRL-A. Итак, в этом примере вместо физической отправки одного символа «A» он выбирает все с помощью сочетания клавиш CTRL-A. Несмотря на то, что пользователь отпустил CTRL (глобальную горячую клавишу), система по-прежнему считает его выключенным.
После того, как мое событие KeyUp сработает, как я могу заставить свою программу ждать какой-то период времени или какое-то событие, чтобы я мог быть уверен, что глобальная горячая клавиша действительно больше не регистрируется системой и только затем отправляет правильный ввод через SendKeys?