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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Перехват системных событий  (Прочитано 13837 раз)
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, но не могу разобраться, что да как. Прошу помощи
Записан
Int main()
Гость
« Ответ #1 : Июль 14, 2013, 14:17 »

так пробовал http://forum.vingrad.ru/act-ST/f-466/t-273910.html - тоже надо setEventFilter
Записан
Int main()
Гость
« Ответ #2 : Июль 14, 2013, 14:21 »

вроде в qt 4.8 все норм http://qt-project.org/forums/viewthread/25594 , а в qt 5.0.1 не катит. Пишут тип надо nativeEvent
Записан
Int main()
Гость
« Ответ #3 : Июль 14, 2013, 14:27 »

здесь как-то не понял два последних поста http://www.prog.org.ru/topic_14386_0.html . Помогите, пожалуйста
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Июль 14, 2013, 14:35 »

Если тебе их надо просто добавить - то используй QxtGlobalShortcut.

Native event filter есть конечно же, это QCoreApplication::installNativeEventFilter().
Записан
Int main()
Гость
« Ответ #5 : Июль 14, 2013, 14:46 »

насчет QxtGlobalShortcut, то никак не могу установить библиотеку qxt. А можно рабочий пример nativeEventFilter
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #6 : Июль 14, 2013, 15:33 »

насчет QxtGlobalShortcut, то никак не могу установить библиотеку qxt.

Под Windows? Просто добавь её исходники себе в проект.

А можно рабочий пример nativeEventFilter

В документации всё описано.
Записан
Int main()
Гость
« Ответ #7 : Июль 14, 2013, 16:19 »

что значит просто дабавь себе в проект?? Либы сначало как-то надо запихнуть в qt, а потом добавлять в проект. Вы так делали как сказали и у вас получилось?
Записан
Int main()
Гость
« Ответ #8 : Июль 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;
}
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Июль 14, 2013, 18:00 »

Native event filter есть конечно же, это QCoreApplication::installNativeEventFilter().
почитай внимательно документацию этого метода
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #10 : Июль 14, 2013, 19:01 »

что значит просто дабавь себе в проект?? Либы сначало как-то надо запихнуть в qt, а потом добавлять в проект.

Просто берёшь и добавляешь исходники qxt (только нужные файлы, а именно qxtglobal.* и qxtglobalshortcut*) в проект и всё.

Вы так делали как сказали и у вас получилось?

Да, делал.
Записан
Int main()
Гость
« Ответ #11 : Июль 14, 2013, 21:47 »

спасибо, решил проблему сам. В RegisterHotkey первым параметром надо указать хендл окна, а саму регистрацию клавиш прописать в LRESULT CALLBACK
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #12 : Июль 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;
}
Записан

Int main()
Гость
« Ответ #13 : Июль 14, 2013, 23:35 »

спасибо конечно, но winEvent не работает в qt5. Надо использовать метод nativeEvent
« Последнее редактирование: Июль 15, 2013, 02:15 от Int main() » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #14 : Июль 15, 2013, 17:24 »

Не увидел, что про Qt 5 говорилось Веселый
Записан

Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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