Как я могу что-то сделать ~ после ~ события в C #? - PullRequest
3 голосов
/ 03 мая 2010

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

1 Ответ

3 голосов
/ 03 мая 2010

Вы можете просто установить таймер и запустить SendKeys за доли секунды (скажем, 100 мс), пользователь не заметит небольшую задержку, но этого будет достаточно, чтобы это произошло вне обработчика событий для KeyUp.

Другой альтернативой может быть размещение в собственном окне (используя PostMessage) специального сообщения, сигнализирующего о том, что он должен «инициировать» эффект и фактически выполнять действия SendKeys в этом пользовательском обработчике сообщений. Это имеет то преимущество, что не использует какую-то произвольную «задержку». Хотя это немного сложнее в настройке (особенно в .NET, где вам нужно P / Invoke еще несколько вызовов API, чтобы заставить его работать, переопределить функцию WndProc и так далее ...

...