Russian Qt Forum
Октябрь 01, 2024, 18:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Запретить Alt+TAB  (Прочитано 6905 раз)
AAXEE
Гость
« : Февраль 12, 2011, 23:53 »

В программе для тестирования учащихся, нужно, чтобы во время тестирования участники не смогли переключится из окна приложения(а также не могли свернуть). Максимум что они смогут - это закрыть и следовательно закончить тест.
Развернул на весь экран showFullScreen()ом, а дальше как быть?
1)Есть идея по таймеру вытаскивать окошко на передний план, если оно вдруг не наверху. Но как это сделать?
2)Комбинации клавиш может отлавливать?
Подскажите пожалуйста.
Записан
chu
Гость
« Ответ #1 : Февраль 13, 2011, 04:28 »

Цитировать
2)Комбинации клавиш может отлавливать?
посмотри QKeyEvent
Записан
shirushizo
Гость
« Ответ #2 : Февраль 13, 2011, 08:26 »

Мне кажется не поможет... можно переопределить у окна bool QWidget::event ( QEvent * event ) и по событию QEvent::WindowDeactivate - закрывать приложение.
Код:
bool Widget::event ( QEvent * event )
{
   if(event->type==QEvent::WindowDeactivate)
   {
      //...другие проверки
      qApp->quit();
   }
}

Ну или делать по событию что-то более гуманное, например, выводить модальный диалог: "Вы хотите прервать тестирование?"
Записан
AAXEE
Гость
« Ответ #3 : Февраль 14, 2011, 08:16 »

Благодарю, помогло.
Записан
QCasper
Гость
« Ответ #4 : Февраль 14, 2011, 08:36 »

Ну так я пошатаюсь по системе / интернету, а потом вернусь и нажму на кнопку "нет". Надо хуками блочить всякие альты и контролы на уровне апи и все дела. Щас не вспомню как именно - давно делал, но инфы по этому делу полно должно быть.
Записан
ufna
Гость
« Ответ #5 : Февраль 14, 2011, 10:51 »

Может поможет: http://www.codeproject.com/KB/winsdk/AntonioWinLock.aspx
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #6 : Февраль 14, 2011, 12:00 »

Поможет.
Но надо иметь ввиду, что хуки только из dll-ки работают. Создать, подстегнуть..
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
bmw
Гость
« Ответ #7 : Февраль 14, 2011, 19:52 »

Поможет.
Но надо иметь ввиду, что хуки только из dll-ки работают. Создать, подстегнуть..
Не только.

kbhook.h
Код:
#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);
}

main.cpp
Код:
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;
    }
}

Кусок из рабочего приложения, но я думаю, разберётесь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.274 секунд. Запросов: 23.