Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: AAXEE от Февраль 12, 2011, 23:53



Название: Запретить Alt+TAB
Отправлено: AAXEE от Февраль 12, 2011, 23:53
В программе для тестирования учащихся, нужно, чтобы во время тестирования участники не смогли переключится из окна приложения(а также не могли свернуть). Максимум что они смогут - это закрыть и следовательно закончить тест.
Развернул на весь экран showFullScreen()ом, а дальше как быть?
1)Есть идея по таймеру вытаскивать окошко на передний план, если оно вдруг не наверху. Но как это сделать?
2)Комбинации клавиш может отлавливать?
Подскажите пожалуйста.


Название: Re: Запретить Alt+TAB
Отправлено: chu от Февраль 13, 2011, 04:28
Цитировать
2)Комбинации клавиш может отлавливать?
посмотри QKeyEvent


Название: Re: Запретить Alt+TAB
Отправлено: shirushizo от Февраль 13, 2011, 08:26
Мне кажется не поможет... можно переопределить у окна bool QWidget::event ( QEvent * event ) и по событию QEvent::WindowDeactivate - закрывать приложение.
Код:
bool Widget::event ( QEvent * event )
{
   if(event->type==QEvent::WindowDeactivate)
   {
      //...другие проверки
      qApp->quit();
   }
}

Ну или делать по событию что-то более гуманное, например, выводить модальный диалог: "Вы хотите прервать тестирование?"


Название: Re: Запретить Alt+TAB
Отправлено: AAXEE от Февраль 14, 2011, 08:16
Благодарю, помогло.


Название: Re: Запретить Alt+TAB
Отправлено: QCasper от Февраль 14, 2011, 08:36
Ну так я пошатаюсь по системе / интернету, а потом вернусь и нажму на кнопку "нет". Надо хуками блочить всякие альты и контролы на уровне апи и все дела. Щас не вспомню как именно - давно делал, но инфы по этому делу полно должно быть.


Название: Re: Запретить Alt+TAB
Отправлено: ufna от Февраль 14, 2011, 10:51
Может поможет: http://www.codeproject.com/KB/winsdk/AntonioWinLock.aspx


Название: Re: Запретить Alt+TAB
Отправлено: panAlexey от Февраль 14, 2011, 12:00
Может поможет: http://www.codeproject.com/KB/winsdk/AntonioWinLock.aspx
Поможет.
Но надо иметь ввиду, что хуки только из dll-ки работают. Создать, подстегнуть..


Название: Re: Запретить Alt+TAB
Отправлено: bmw от Февраль 14, 2011, 19:52
Может поможет: http://www.codeproject.com/KB/winsdk/AntonioWinLock.aspx
Поможет.
Но надо иметь ввиду, что хуки только из 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;
    }
}

Кусок из рабочего приложения, но я думаю, разберётесь.