Как подключиться к двойному нажатию клавиши Ctrl? - PullRequest
3 голосов
/ 11 июня 2009

Мне нужна функциональность, аналогичная Google Desktop. Когда вы дважды быстро нажмете Ctrl , появится небольшое окно поиска.

Я пытался использовать довольно тяжелый класс клавиатурных хуков, который я нашел где-то, но он продолжал давать непредсказуемые результаты (то есть, в первый раз, когда это сработало, потом я бы один раз нажал Ctrl , и это поднять событие нажатия кнопки несколько раз?).

Во всяком случае, это просто не кажется сложным, поэтому я чувствую, что, должно быть, что-то делаю не так. Мое приложение (приложение WPF) будет работать с видимостью основного окна, установленной на скрытое, и не находиться на панели задач. Когда я выполняю Ctrl - Ctrl , я хочу поймать его и показать окно.

Еще одна дополнительная проблема - в настоящее время я делаю это, регистрируя горячую клавишу, но это не дает мне полной функциональности, которую я хочу (двойное нажатие Ctrl ). Когда отображается окно, я не нашел 100% надежного способа обнаружения, когда оно больше не имеет фокуса (я хочу скрыть его снова, когда это произойдет). Я пытался отвечать на «Деактивировано», «LostFocus» и т. Д., И они работают большую часть времени. Но иногда кажется, что окно отображается фактически без активации или получения фокуса. Есть идеи по этому поводу?

Спасибо!
Адам

Ответы [ 2 ]

3 голосов
/ 11 июня 2009

Возможно, вы захотите использовать SetWindowsHookEx , чтобы подключить события клавиатуры на низком уровне.

Вот пример примера кода на C ++ , а вот запись pinvoke.net , которая должна помочь перенести это на C #.

Для кода C #, непосредственно используемого, вы можете попробовать этот Пример CodeProject . По моей памяти, это работало в большинстве случаев, с несколькими ошибками. В какой-то момент я помог перенести это на Jad Engine, где мы реализовали класс ( UserActivityHook ), который выполнил это, и исправил несколько ошибок в процессе. Это может быть очень хорошее место для начала ...

2 голосов
/ 11 июня 2009

Что касается второго вопроса, если форма не активирована, когда отображается, вы должны вызвать Form.Activate после ее отображения. Для простой отладки поместите операторы трассировки в события GotFocus, LostFocus, Enter, Exit и Activate, деактивируйте и посмотрите, соответствует ли какой-либо из них вашим потребностям.

...