Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] и Hotkey - как обстоят дела? Как задать глобальный HotKey? 
:(
    Опции темы
bvn13
Дата 23.9.2009, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 26.5.2009

Репутация: нет
Всего: нет



хочется что-то наподобие горячих клавиш ВинАмпа. Т.е. у себя я задаю горячую клавишу и обработчик для нее (в виде строковой переменной, просто набор символов), а при нажатии на этот хоткей (в любом приложении Винды), перехватить эту комбинацию. Так вот не могу понять, как можно задать такой вид HotKey-ев. Это же получается, глобальные хоткеи? Если так, то можно ли через QT Creater 4.x (какой там свежий с сайта?) задать эти HotKey-и и как это сделать проще?
PM MAIL   Вверх
SABROG
Дата 23.9.2009, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



В Qt никак. Использовать сторонние разработки: http://doc.libqxt.org/0.5.0/classQxtGlobalShortcut.html


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
bvn13
Дата 24.9.2009, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 26.5.2009

Репутация: нет
Всего: нет



Цитата(SABROG @ 23.9.2009,  14:30)
В Qt никак. Использовать сторонние разработки: http://doc.libqxt.org/0.5.0/classQxtGlobalShortcut.html

А эта библа нормально становится на MSVS? (Qt уже стоит на MSVS). Какие-нибудь недокументированные действия или особенности есть?
PM MAIL   Вверх
SABROG
Дата 24.9.2009, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Никогда не пробовал.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Fortnox
Дата 26.9.2009, 03:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 31.10.2008
Где: Ростов-на-Дону

Репутация: нет
Всего: 22



Недавно пришлось реализовывать глобальные горячие клавиши через Qt, помучился изрядно, но в итоге получилось.

В заголовочном файле добавляем windows.h для API функций. Потом, согласно MSDN, объявляем нашу горячую клавишу и ее значение.
Далее, куря доки Qt, находим: чтобы клавиши перехватывались на уровне системы, фильтр событий нужно вешать на QAbstractEventDispatcher::instance(). 
На данный момент добавляем в заголовочный файл следующее:
Код

#include <windows.h>
#define HOTKEYCODE 0xC001
QAbstractEventDispatcher* m_EventDispatcher;
/*наш фильтр сообщений системы, в нем будем "ловить" 
клавишу нашу. Правда пока пришлось объявить его статическим. 
По-другом не работает (или я пока не понял как это сделать) */
static bool hotKeyEventFilter(void *message); 


Теперь дело за cpp файлом. 
Код

m_EventDispatcher = QAbstractEventDispatcher::instance();
QCoreApplication::instance()->installEventFilter(m_EventDispatcher); //устанавливаем фильтр событий
m_EventDispatcher->setEventFilter((QAbstractEventDispatcher::EventFilter)bosskeyPlugin::hotKeyEventFilter); 
//устанавливаем перехват в нашем фильтре

/*регистрируем клавишу. В данном примере это Ctrl+F11*/
RegisterHotKey(NULL, HOTKEYCODE, MOD_CONTROL, VK_F11)

bool bosskeyPlugin::hotKeyEventFilter(void *message)
{
    MSG *msg;
    msg = (MSG*)message;
    if (msg->message == WM_HOTKEY) 
    {
        // делаем что нам надо
        return true;
    }
    return false;
}



И потом, когда не нужна будет горячая клавиша, удаляем ее:
Код

UnregisterHotKey(NULL, HOTKEYCODE);


Вот такое вот "чудо" получилось.   smile 

P.S. libqxt пытался использовать, но не получилось почему то, горячие клавиши так и не хотели срабатывать.


Это сообщение отредактировал(а) Fortnox - 26.9.2009, 10:42
PM MAIL   Вверх
bvn13
Дата 28.9.2009, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 26.5.2009

Репутация: нет
Всего: нет



Цитата(Fortnox @ 26.9.2009,  03:54)
Вот такое вот "чудо" получилось.   smile 

P.S. libqxt пытался использовать, но не получилось почему то, горячие клавиши так и не хотели срабатывать.

Вот за это спасибо. Буду пробовать. libqxt мне вообще не удалось на MSVS насадить. Не может найти заголовочные файлы при их подключении и все тут.
PM MAIL   Вверх
bvn13
Дата 13.10.2009, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 26.5.2009

Репутация: нет
Всего: нет



Цитата(Fortnox @ 26.9.2009,  03:54)
Недавно пришлось реализовывать глобальные горячие клавиши через Qt, помучился изрядно, но в итоге получилось.

Вчитался только в твой код... Я чего-то себе как-то по-другому представлял логику работы с глобальными клавишами... Я думал, что надо четко привязывать процедуру к событию нажатия... Чуть ли не для конкретной комбинации клавиш - свою процедуру.

Я тут хочу организовать динамический список горячих клавиш и действий по ним. Вот и думаю, если писать что-то похожее на твою реализацию, то как мне определить, какая сейчас комбинация была нажата?
PM MAIL   Вверх
Fortnox
Дата 19.10.2009, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 31.10.2008
Где: Ростов-на-Дону

Репутация: нет
Всего: 22



Если не ошибаюсь, но в структуре MSG либо WPARAM, либо LPARAM cодержит код нажатой (или нажатых) клавиш(ы).

Я до сих пор "шаманю" с горячими клавишами, вечно то ломаю, то заставляю работать нормально, но нормального стабильного результата так и не добился, пока.
Можно посмотреть исходники qmmp, там глобальные горячие клавиши.

Код, как я представляю, будет выглядеть так:
Код

if (msg->message == WM_HOTKEY) 
    {
        switch (msg->wParam) //или msg->lParam
         {
            case VK_F1: {//код; break;}
            case VK_F2: {//код; break;}
            //и так далее...
    }
        return true;
    }

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0597 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.