Я использую следующий проект для обработки глобальных перехватов клавиатуры и мыши в моем приложении C #.
Этот проект по сути является оболочкой для вызова 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?