bool Widget::event ( QEvent * event ){ if(event->type==QEvent::WindowDeactivate) { //...другие проверки qApp->quit(); }}
#include <windows.h>LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);HHOOK hHook;LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){ if (nCode != HC_ACTION) return CallNextHookEx(NULL, nCode, wParam, lParam); // курим мсдн /* nCode [in] Specifies a code the hook procedure uses to determine how to process the message. If nCode is less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and should return the value returned by CallNextHookEx. This parameter can be one of the following values. HC_ACTION */ PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam; switch (wParam) { /* wParam [in] Specifies the identifier of the keyboard message. This parameter can be one of the following messages: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, or WM_SYSKEYUP. */ case WM_KEYDOWN: case WM_SYSKEYDOWN: //Блокируем системные клавиши if((p->vkCode == VK_ACCEPT)|| (p->vkCode == VK_F1)||... ) { //MessageBeep(0xffffffff); //printf("%d",p->vkCode); return(1); // блокируем кнопку пуск, }; break; case WM_KEYUP: case WM_SYSKEYUP: //Отжатия клавиш тоже никчему пропускать. if((p->vkCode == VK_ACCEPT)|| (p->vkCode == VK_F1)||... ) { //MessageBox(0,"Button START is pressed or released","OK",MB_OK); //Поскольку приложение засыпает, не выйдя из обработчика пуск открывается. return(1); // блокируем кнопку пуск, }; break; } return CallNextHookEx(NULL, nCode, wParam, lParam);}
void LockWindow::setHook(){ //If parameter is NULL, GetModuleHandle returns a pseudo handle to the current process. hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandle(NULL), NULL); // Ставим хук WH_KEYBOARD_LL if (!hHook) { // Проверка на правильность установки хука QMessageBox::critical(this, QString("Error in keyboard lock"),QString("Unable to set keyboard lock! [keyHook enable error]"), QMessageBox::Ok); return; } //MessageBox(0,TEXT("Press OK for exit"),TEXT("OK"),MB_OK); // ждем пока надоест играться с хуком //UnhookWindowsHookEx(hHook); return;}void LockWindow::unsetHook(){ if (hHook) { // Если хук был установлен, снимемс его UnhookWindowsHookEx(hHook); return; }}