Название: Перехват системных событий Отправлено: Int main() от Июль 14, 2013, 14:13 Всем привет. Мне нужно перехватить системные события, а точнее глобальные хоткеи. Работаю в qt 5.0.2. Пробовал вот так, с помощью winEvent http://www.cyberforum.ru/qt/thread227019.html - ничего не получилось, в qt 5.0.2 походу нет setEventFilter, а только в более меньших версиях qt. Слышал мол для моей версии qt есть nativeEvent, но не могу разобраться, что да как. Прошу помощи
Название: Re: Перехват системных событий Отправлено: Int main() от Июль 14, 2013, 14:17 так пробовал http://forum.vingrad.ru/act-ST/f-466/t-273910.html - тоже надо setEventFilter
Название: Re: Перехват системных событий Отправлено: Int main() от Июль 14, 2013, 14:21 вроде в qt 4.8 все норм http://qt-project.org/forums/viewthread/25594 , а в qt 5.0.1 не катит. Пишут тип надо nativeEvent
Название: Re: Перехват системных событий Отправлено: Int main() от Июль 14, 2013, 14:27 здесь как-то не понял два последних поста http://www.prog.org.ru/topic_14386_0.html . Помогите, пожалуйста
Название: Re: Перехват системных событий Отправлено: Alex Custov от Июль 14, 2013, 14:35 Если тебе их надо просто добавить - то используй QxtGlobalShortcut.
Native event filter есть конечно же, это QCoreApplication::installNativeEventFilter(). Название: Re: Перехват системных событий Отправлено: Int main() от Июль 14, 2013, 14:46 насчет QxtGlobalShortcut, то никак не могу установить библиотеку qxt. А можно рабочий пример nativeEventFilter
Название: Re: Перехват системных событий Отправлено: Alex Custov от Июль 14, 2013, 15:33 насчет QxtGlobalShortcut, то никак не могу установить библиотеку qxt. Под Windows? Просто добавь её исходники себе в проект. А можно рабочий пример nativeEventFilter В документации всё описано. Название: Re: Перехват системных событий Отправлено: Int main() от Июль 14, 2013, 16:19 что значит просто дабавь себе в проект?? Либы сначало как-то надо запихнуть в qt, а потом добавлять в проект. Вы так делали как сказали и у вас получилось?
Название: Re: Перехват системных событий Отправлено: Int main() от Июль 14, 2013, 16:25 скажите, что делаю не так ? Объявил регистрацию глобальных клавиш в конструкторе(это кл. shift). Потом в заголовочном файле добавил в protected фунцию virtual bool nativeEvent() с нужными параметрами и собственно реализация в .cpp файле: MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); RegisterHotKey(0, 1, MOD_SHIFT, 0); } MainWindow::~MainWindow() { delete ui; } bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result) { //MSG *msg = (MSG*)message; Q_UNUSED(result); Q_UNUSED(eventType); MSG* msg = reinterpret_cast<MSG*>(message); switch(msg->message) { case WM_HOTKEY: if(msg->wParam == 1) { qDebug() << "Hotkey pressed!!!"; break; } } return false; } Название: Re: Перехват системных событий Отправлено: kambala от Июль 14, 2013, 18:00 Native event filter есть конечно же, это QCoreApplication::installNativeEventFilter(). почитай внимательно документацию этого методаНазвание: Re: Перехват системных событий Отправлено: Alex Custov от Июль 14, 2013, 19:01 что значит просто дабавь себе в проект?? Либы сначало как-то надо запихнуть в qt, а потом добавлять в проект. Просто берёшь и добавляешь исходники qxt (только нужные файлы, а именно qxtglobal.* и qxtglobalshortcut*) в проект и всё. Вы так делали как сказали и у вас получилось? Да, делал. Название: Re: Перехват системных событий Отправлено: Int main() от Июль 14, 2013, 21:47 спасибо, решил проблему сам. В RegisterHotkey первым параметром надо указать хендл окна, а саму регистрацию клавиш прописать в LRESULT CALLBACK
Название: Re: Перехват системных событий Отправлено: gil9red от Июль 14, 2013, 23:18 Я так делал.
Все что нужно для отлавливания глобальных кликов: Код: const short PUSH_BUTTON_PRINT_SCREEN = 0x0000; Код:
Код:
Код: bool MyWidget::winEvent(MSG *message, long *result) Название: Re: Перехват системных событий Отправлено: Int main() от Июль 14, 2013, 23:35 спасибо конечно, но winEvent не работает в qt5. Надо использовать метод nativeEvent
Название: Re: Перехват системных событий Отправлено: gil9red от Июль 15, 2013, 17:24 Не увидел, что про Qt 5 говорилось :D
Название: Re: Перехват системных событий Отправлено: Int main() от Июль 15, 2013, 20:26 кстати, а где лучше убирать регистрацию глобальных хоткеев? В деструкторе?
Название: Re: Перехват системных событий Отправлено: Alex Custov от Июль 15, 2013, 20:41 да, если главное окно создаётся в стеке (или в куче и явным образом удаляется через delete).
|