c # - как отключить горячие клавиши (кроме ctrl + alt + delete) - PullRequest
0 голосов
/ 19 декабря 2011

У меня есть приложение winform , и я хотел бы отключить некоторые комбинации клавиш во время выполнения этого приложения.

Я хочу отключить все комбинации клавиш (Ctrl+Esc, Alt+Tab, WinKeys и т. Д.), Кроме Ctrl+Alt+Delete.

Я использую c# для программирования.

Спасибо.

1 Ответ

3 голосов
/ 19 декабря 2011

Правильный способ сделать это - вообще не использовать C # (или любой другой язык программирования).

Вместо этого вам нужно воспользоваться встроенной поддержкой Windows для ограниченных учетных записей пользователей и других связанных с безопасностью учетных записей.положения.Вы можете заблокировать компьютер настолько плотно, что пользователь ничего не сможет сделать.Этот тип вещей контролируется групповыми политиками, а не чем-то, что отдельное приложение должно иметь какой-либо контроль над.

Вы можете задать дополнительные вопросы о конфигурации групповой политики и блокировке компьютера Windows на Ошибка сервера , еще один сайт Stack Exchange, который занимается вопросами такого типа.Но я рекомендую сначала выполнить поиск, чтобы узнать, был ли там уже дан ответ на ваш вопрос!


Если вы абсолютно должны сделать это в C #, ваше единственное решение будетнизкоуровневый крючок для клавиатуры.Во-первых, потому что это единственный тип хуков, который вы можете создать в C #, а во-вторых, потому что вам нужно иметь возможность перехватывать и отбрасывать нажатия клавиш, прежде чем любое другое приложение (включая саму ОС) сможет их получать и обрабатывать.

Хорошо, что вы специально исключили Ctrl + Alt + Delete в вопросе, потому что вы не сможете ограничить его, даже с помощью низкоуровневой клавиатуры.

Вы найдете пример реализации здесь, в блоге Стивена Туба .

Хитрость в том, что вы не будете вызывать функцию CallNextHookEx() для клавишинажатия, которые вы хотите сбросить, что предотвращает передачу информации о событии следующему приложению в цепочке соединений.В соответствии с документацией для CallNextHookEx():

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

Поэтому вам нужно убедиться, что вы do вызываете функцию для обычноговвод с клавиатуры, но не , который вы хотите выбросить.Вместо CallNextHookEx вы захотите вернуть 1— new IntPtr(1).

. В примере кода все это будет происходить в методе HookCallback, который вызывается каждый раз, когда происходит событие клавиатуры.получено.Используйте оператор switch для значения vkCode (который дает вам код виртуальной клавиши нажатой клавиши), чтобы определить, какой ввод вы хотите отклонить.

...