Перед вами
очередной выпуск рассылки "Программирование на
WinApi"
Отключение
клавиш
Существует несколько
методов, которые позволяют ограничить пользователя в плане перезагрузки
компьютера. Самый простой, это отключить комбинацию клавиш Ctrl+Alt+Del.
Следующий код отключает сочетание Ctrl+Alt+Del и Alt+Tab.
//Отключить
res = 1;
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, (void *) &res, 0);
//Включить
res = 1; SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, (void *) &res, 0);
Другой
метод заключается в установлении процедуры ловушки на нажатие клавиш:
LRESULT CALLBACK LowLevelKeyboardProc(int nCode,
WPARAM wParam, LPARAM lParam) {
BOOL fEatKeystroke = FALSE;
if (nCode == HC_ACTION) {
switch (wParam) {
case WM_KEYDOWN: case WM_SYSKEYDOWN:
case WM_KEYUP: case WM_SYSKEYUP:
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
fEatKeystroke =
( (p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0) ) ||
( (p->vkCode == VK_ESCAPE) && ((p->flags & LLKHF_ALTDOWN) != 0) ) ||
( (p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0) )||
( (p->vkCode == 46) && ( (p->flags & LLKHF_ALTDOWN) != 0 ) &&
( (GetKeyState(VK_CONTROL) & 0x8000) != 0));
//тут можно добавить другие клавиши....
//код 46 означает del
break;
}
}
return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam));
}
int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) {
// Устанавливаем низкоуровневую ловушку на клавиатуру и мышку
HHOOK hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL,
LowLevelKeyboardProc, hinstExe, 0);
// Ловушки будут работать пока не завершится приложение
MessageBox(NULL,
TEXT("Alt+Esc, Ctrl+Esc, и Alt+Tab не работают.\n"),
TEXT("Отключение клавиш"), MB_OK);
UnhookWindowsHookEx(hhkLowLevelKybd);
return(0);
}