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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как отловить нажатие и отжатие клавиши PrintScreen?  (Прочитано 4712 раз)
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« : Январь 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.
« Последнее редактирование: Январь 29, 2016, 10:17 от billy4685 » Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

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


Просмотр профиля
« Ответ #1 : Январь 29, 2016, 11:20 »

В виндовс клавиатурные хуки работают только из dll.
ПС. Так на всякий случай говорю.
« Последнее редактирование: Январь 29, 2016, 11:28 от panAlexey » Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Январь 29, 2016, 11:43 »

Не только
Записан

ArchLinux x86_64 / Win10 64 bit
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Январь 29, 2016, 11:56 »

Все задачи такого плана начинаются со стандартной процедуры:  вешаете фильтр на qApp (или перекрываете notify) и печатаете все приходящие события (кроме таймера, задолбает). Нажимаете прынт-скрын и смотрите какие еветны вообще пришли. Бывает так что вообще "ничего", тогда лезть в nativeEvent, ну то редко

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

Сообщений: 306


Просмотр профиля
« Ответ #4 : Январь 30, 2016, 10:29 »

Все задачи такого плана начинаются со стандартной процедуры:  вешаете фильтр на qApp (или перекрываете notify) и печатаете все приходящие события (кроме таймера, задолбает). Нажимаете прынт-скрын и смотрите какие еветны вообще пришли. Бывает так что вообще "ничего", тогда лезть в nativeEvent, ну то редко

Печаталку событий лучше иметь всегда и включать напр по #ifdef
спасибо, буду пробовать
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Январь 30, 2016, 10:40 »

спасибо, буду пробовать
У вас не получится отловить PrintScreen средствами Qt. Смотрите, что для этого есть в венде.
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #6 : Январь 30, 2016, 12:17 »

спасибо, буду пробовать
У вас не получится отловить PrintScreen средствами Qt. Смотрите, что для этого есть в венде.

хорошо, буду смотреть в сторону win api
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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