Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Int main() от Июль 14, 2013, 14:13



Название: Перехват системных событий
Отправлено: 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;

Код:
        
// регистрируем в винде что событие нажатия
// кнопку скрина будет отлавливать наша программа
RegisterHotKey(winId(), PUSH_BUTTON_PRINT_SCREEN,
                      0, VK_SNAPSHOT);

Код:
    
// убираем регистрацию
UnregisterHotKey(winId(), PUSH_BUTTON_PRINT_SCREEN);

Код:
bool MyWidget::winEvent(MSG *message, long *result)
{
    // отловили событие нажатия
    if(message->message == WM_HOTKEY)
    {
        // если нажата кнопка скрин
        if(message->wParam == (unsigned)PUSH_BUTTON_PRINT_SCREEN)
        {
            shootScreen();
        }
        return true;
    }
    return false;
}


Название: 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).