Russian Qt Forum

Qt => Вопросы новичков => Тема начата: billy4685 от Январь 29, 2016, 09:35



Название: Как отловить нажатие и отжатие клавиши PrintScreen?
Отправлено: billy4685 от Январь 29, 2016, 09:35
Добрый день, всем посетителям данного форума. Пишу вот тест клавиатуры для Windows. Не думал, что при написании столь простого приложения
столкнусь с проблемами. Но увы я ошибался)).

По началу для отлавливания нажатия и отжатия клавиши использовал следующие методы:

Код:
QString pressStyle = "QPushButton{background-color: green; border: 2px solid grey;}";
QString releaseStyle = "QPushButton{background-color: darkGrey; border: 2px solid grey;}";
 
void KEY_TEST::keyPressEvent(QKeyEvent *event)
{
   if(key==Qt::Key_F1)
       key_test_frame->ui->pushButtonF1->setStyleSheet(pressStyle);
 
   ................................
   // и так далее все остальные клавиши

   event->accept();
}

void KEY_TEST::keyReleaseEvent(QKeyEvent *event)
{
   if(key==Qt::Key_F1)
       key_test_frame->ui->pushButtonF1->setStyleSheet(releaseStyle);
 
   ................................
   // и так далее все остальные клавиши

   event->accept();
}

Столкнулся с проблемой что клавиша PrintScreen (пытался отлавливать по ключу Key_Print) не срабатывает. Так же по ключам Key_Shift, Key_Control,
Key_Meta, Key_Alt определялось нажатие соответственно как и левых так и правых клавиш Shift, Сtrl, Meta(Win), Alt (а хотелось бы их различать).

По этому решил использовать кода клавиш, это бы позволило запускать тест не только при английской раскладке. Переписал свои методы в другой вид:

Код:
void KEY_TEST::keyPressEvent(QKeyEvent *event)
{
   if(event->nativeScanCode()==59)
       key_test_frame->ui->pushButtonF1->setStyleSheet(pressStyle);
 
   ................................
   // и так далее все остальные клавиши

   event->accept();
}

void KEY_TEST::keyReleaseEvent(QKeyEvent *event)
{
   if(event->nativeScanCode()==59)
       key_test_frame->ui->pushButtonF1->setStyleSheet(releaseStyle);
 
   ................................
   // и так далее все остальные клавиши

   event->accept();
}

Это решило проблему с клавишами Shift, Сtrl, Win, Alt. Но с PrintScreen проблема так и осталась не решенной. Также на украинской раскладке
при нажатии  правого Alt-а почему-то срабатывает и нажатие левого Ctrl-а. Не знаю может это специально реализовано для каких-нибудь целей.

Нашел вот пример по PrintScreen:
https://sites.google.com/site/ecspertiza/stati/qt/perehvat-nazatia-print-screen-v-qt

Но увы, когда я подцепил это к своему тесту, то такое ощущение, что клавиатура отлавливает только нажатие клавиш, а отжатие нет.
К тому же замечал, что клавиатура за частую начинает тупить, как буд-то отключается, и чтобы она снова запустилась нужно выключить
приложение, выйти из системы Windows и снова ввойти.

Буду рад всем советам по-поводу отлавливания нажатия и отжатия клавиши PrintScreen в Windows.


Название: Re: Как отловить нажатие и отжатие клавиши PrintScreen?
Отправлено: panAlexey от Январь 29, 2016, 11:20
В виндовс клавиатурные хуки работают только из dll.
ПС. Так на всякий случай говорю.


Название: Re: Как отловить нажатие и отжатие клавиши PrintScreen?
Отправлено: kuzulis от Январь 29, 2016, 11:43
Не только


Название: Re: Как отловить нажатие и отжатие клавиши PrintScreen?
Отправлено: Igors от Январь 29, 2016, 11:56
Все задачи такого плана начинаются со стандартной процедуры:  вешаете фильтр на qApp (или перекрываете notify) и печатаете все приходящие события (кроме таймера, задолбает). Нажимаете прынт-скрын и смотрите какие еветны вообще пришли. Бывает так что вообще "ничего", тогда лезть в nativeEvent, ну то редко

Печаталку событий лучше иметь всегда и включать напр по #ifdef


Название: Re: Как отловить нажатие и отжатие клавиши PrintScreen?
Отправлено: billy4685 от Январь 30, 2016, 10:29
Все задачи такого плана начинаются со стандартной процедуры:  вешаете фильтр на qApp (или перекрываете notify) и печатаете все приходящие события (кроме таймера, задолбает). Нажимаете прынт-скрын и смотрите какие еветны вообще пришли. Бывает так что вообще "ничего", тогда лезть в nativeEvent, ну то редко

Печаталку событий лучше иметь всегда и включать напр по #ifdef
спасибо, буду пробовать


Название: Re: Как отловить нажатие и отжатие клавиши PrintScreen?
Отправлено: Old от Январь 30, 2016, 10:40
спасибо, буду пробовать
У вас не получится отловить PrintScreen средствами Qt. Смотрите, что для этого есть в венде.


Название: Re: Как отловить нажатие и отжатие клавиши PrintScreen?
Отправлено: billy4685 от Январь 30, 2016, 12:17
спасибо, буду пробовать
У вас не получится отловить PrintScreen средствами Qt. Смотрите, что для этого есть в венде.

хорошо, буду смотреть в сторону win api