Правильный способ сделать это - вообще не использовать C # (или любой другой язык программирования).
Вместо этого вам нужно воспользоваться встроенной поддержкой Windows для ограниченных учетных записей пользователей и других связанных с безопасностью учетных записей.положения.Вы можете заблокировать компьютер настолько плотно, что пользователь ничего не сможет сделать.Этот тип вещей контролируется групповыми политиками, а не чем-то, что отдельное приложение должно иметь какой-либо контроль над.
Вы можете задать дополнительные вопросы о конфигурации групповой политики и блокировке компьютера Windows на Ошибка сервера , еще один сайт Stack Exchange, который занимается вопросами такого типа.Но я рекомендую сначала выполнить поиск, чтобы узнать, был ли там уже дан ответ на ваш вопрос!
Если вы абсолютно должны сделать это в C #, ваше единственное решение будетнизкоуровневый крючок для клавиатуры.Во-первых, потому что это единственный тип хуков, который вы можете создать в C #, а во-вторых, потому что вам нужно иметь возможность перехватывать и отбрасывать нажатия клавиш, прежде чем любое другое приложение (включая саму ОС) сможет их получать и обрабатывать.
Хорошо, что вы специально исключили Ctrl + Alt + Delete в вопросе, потому что вы не сможете ограничить его, даже с помощью низкоуровневой клавиатуры.
Вы найдете пример реализации здесь, в блоге Стивена Туба .
Хитрость в том, что вы не будете вызывать функцию CallNextHookEx()
для клавишинажатия, которые вы хотите сбросить, что предотвращает передачу информации о событии следующему приложению в цепочке соединений.В соответствии с документацией для CallNextHookEx()
:
Вызов CallNextHookEx не является обязательным, но настоятельно рекомендуется;в противном случае другие приложения, в которых установлены хуки, не будут получать уведомления о хуках и в результате могут работать некорректно.Вы должны вызывать CallNextHookEx, если вам абсолютно не нужно предотвращать просмотр уведомления другими приложениями.
Поэтому вам нужно убедиться, что вы do вызываете функцию для обычноговвод с клавиатуры, но не , который вы хотите выбросить.Вместо CallNextHookEx
вы захотите вернуть 1— new IntPtr(1)
.
. В примере кода все это будет происходить в методе HookCallback
, который вызывается каждый раз, когда происходит событие клавиатуры.получено.Используйте оператор switch
для значения vkCode
(который дает вам код виртуальной клавиши нажатой клавиши), чтобы определить, какой ввод вы хотите отклонить.