Відключення ctrl-alt-delete, alt-tab, пуск та інших сполучень

Це вільний переклад статті з сайту tamas.io про програмному відключенні і включенні гарячих клавіш Windows засобами C #. Зовсім недавно мені самому знадобилися подібні функції в моїй програмі і я з подивом виявив, що в рунеті нічого про це немає, та й взагалі в мережі про це сказано зовсім небагато. Так що, якщо цікаво чи також потрібно, як було мені - ласкаво просимо!

Після невеликого дослідження з відключення клавіш і їх поєднань я дізнався, що є кілька способів зміни поведінки раніше згаданих ключових комбо.

Не хвилюйтеся, ми не будемо розглядати їх тут, але я покажу, як з ними працювати.

Використовуємо можливості редагування реєстру C #, щоб встановити / змінити групову політику для послідовності клавіш CTRL-ALT-DEL. Давайте подивимося, що можна зробити не написавши жодного рядка коду. Відкрийте «Пуск -> Виконати» і наберіть gpedig.msc. Перейдіть до: Конфігурація користувача> Адміністративні шаблони> Система> Варіанти дій після натискання CTRL-ALT-DEL (User Configuration> Administrative Templates> System> CTRL + ALT + DELETE Options). Це те місце, де стандартним способом можна встановити дію, яке буде викликано натисненням цього комбо. Двічі клацніть по "Видалити диспетчер задач» (Remove Task Manager). Зміна цього параметра змінює значення в SoftwareMicrosoftWindowsCurrentVersionPoliciesSystem і значення DisableTaskMgr отримає значення 1.

Тепер завдання стала ясніше.

Важливо, не пропустіть цей рядок:

Метод, який я написав, виглядає наступним чином:

Таким чином, ми подбали про зміну значення комбінації CTRL-ALT-DEL. Розглянемо інші поєднання. Можливо, вам могло здатися це складним, але це простіше простого. Як відключити ALT + F4? Всього 5 рядків коду:

Процедура LowLevelKeyboardProc - це програмно певна або бібліотечно певна процедура виклику функції, яка використовується спільно з функцією SetWindowsHookEx. Система викликає цю функцію кожен раз, коли подія введення з клавіатури ось-ось буде розміщено в черзі потоку введення. Введення з клавіатури може пройти через драйвер або через виклики функції keybdevent. Якщо виклик стався через виклик keybdevent, то він був «введений» (injected). Проте, хук WHKEYBOARDLL не впроваджуються в інший процес. Замість цього, контекст перемикається на інший процес, на який встановлений хук і викликається в первісному вигляді. Потім, контекст перемикається назад на додаток, яке викликало цю подію.

І знову, не забудьте:

Тут все інше, що може ще вам стати в нагоді:

Цілком очевидно, що ви можете програмно повернути все значення, знову включивши всі поєднання:

Від себе доповню, що в .NET4 код виду:

Не працює. Потрібно писати щось типу:

Ну і в початок коду структури AddHooks, серед іншого імпорту зробити:

Сподіваюся, переклад вийшов не зовсім поганий і виявиться кому - або корисний.