crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> RegisterHotKey, платформозависимый код
jim1406
  опции профиля:
сообщение 29.4.2009, 8:59
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 17.3.2009
Пользователь №: 618

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброго времени суток!
Нужно перехватить глобальное клавиатурное сочетание в Windows. Подскажите, как это сделать? (без сторонней библиотеки).
Qt 4.5
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 29.4.2009, 10:30
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


jim1406,
что пробовал делать для того чтобы перхватывать?
QWidget::winEvent(MSG*,long*)[virtual protected] -- смотрел?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sploid
  опции профиля:
сообщение 29.4.2009, 11:06
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 51
Регистрация: 26.2.2008
Из: Москва
Пользователь №: 106

Спасибо сказали: 10 раз(а)




Репутация:   1  


посмотри это:
http://doc.libqxt.org/0.4.0/classQxtGlobalShortcut.html
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.4.2009, 12:11
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9666
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


jim1406, может просто подсмотреть как это делается в том же libqxt?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
jim1406
  опции профиля:
сообщение 30.4.2009, 4:45
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 17.3.2009
Пользователь №: 618

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(kwisp @ 29.4.2009, 14:30) *
jim1406,
что пробовал делать для того чтобы перхватывать?
QWidget::winEvent(MSG*,long*)[virtual protected] -- смотрел?

Да, только не понял тип MSG...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
jim1406
  опции профиля:
сообщение 30.4.2009, 8:33
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 17.3.2009
Пользователь №: 618

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(sploid @ 29.4.2009, 15:06) *

Попытался использовать эту библиотеку...
Скачал версию 5, Qt у меня 4.5 (Qt Creator 1.0.0), ОС Windows. Распаковал в C:\libqxt . Дальше сделал qmake libqxt.pro. Запустил configure.bat. Запустил make install. Скопировал C:\libqxt\deploy\qt\qxt.prf в C:\Qt\2009.01\qt\mkspecs\features (This will also install qxt.prf to your qtdir/mkspecs/features directory - вручную). В проекте дорисовал
CONFIG  += qxt
QXT     += core gui

Итог при компиляции... collect 2: ld returned 1 exit status
Если qxt не использовать (только инклюд прописать), то лечится QXT += core gui т.е.
CONFIG  += qxt
# QXT     += core gui

Я так понимаю, что не правильно собрал... Где накосячил-то?!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 30.4.2009, 8:48
Сообщение #7


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(jim1406 @ 30.4.2009, 9:33) *
Скачал версию 5, Qt у меня 4.5 (Qt Creator 1.0.0), ОС Windows. Распаковал в C:\libqxt . Дальше сделал qmake libqxt.pro. Запустил configure.bat. Запустил make install.

а чему ты сделал make install ?
обычно make -- собирает
make install -- копирует, переносит то что ты уже собрал. или в этом случае по другому?


Цитата(jim1406 @ 30.4.2009, 5:45) *
Да, только не понял тип MSG...

смотри MSDN -- больше выхода нет. только конечно я не уверен что этот метод все сообщения получает однако где то я читал что можно даже перхватить сигнал выключения компьютера и прервать сие действие.

кстати а не пробовал просто метод event(QEvent*) не получает ли совершенно случайно то событие которое тебя интересует?

Сообщение отредактировал kwisp - 30.4.2009, 8:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
jim1406
  опции профиля:
сообщение 30.4.2009, 9:34
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 17.3.2009
Пользователь №: 618

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата
а чему ты сделал make install ?
обычно make -- собирает
make install -- копирует, переносит то что ты уже собрал. или в этом случае по другому?

сначала make, потом make install... а инсталл вот откуда взялся

Цитата
смотри MSDN -- больше выхода нет. только конечно я не уверен что этот метод все сообщения получает однако где то я читал что можно даже перхватить сигнал выключения компьютера и прервать сие действие.
кстати а не пробовал просто метод event(QEvent*) не получает ли совершенно случайно то событие которое тебя интересует?

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

Цитата(Litkevich Yuriy @ 29.4.2009, 16:11) *
jim1406, может просто подсмотреть как это делается в том же libqxt?

Посмотрел, спасибо - красиво делают :) А правильно собрать библиотеку не поможешь? :)

Сообщение отредактировал jim1406 - 30.4.2009, 11:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DmP
  опции профиля:
сообщение 30.4.2009, 10:45
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 61
Регистрация: 11.3.2008
Пользователь №: 116

Спасибо сказали: 15 раз(а)




Репутация:   2  


Вот сделано на основе libqxt, может не очень красиво но работает:
#include <qt_windows.h>

MyForm::MyForm()
    : QMainWindow()
{
    setupUi(this);

    m_hotKeyId1 = 0;
    m_hotKeyId2 = 0;

    registerHotKey();
}

MyForm::~MyForm()
{
    unregisterHotKey();
}

bool MyForm::winEvent(MSG* message, long* result)
{
    if (message->message == WM_HOTKEY)
    {
        const int virtualKeyCode = HIWORD(message->lParam);
        const int modifiers = LOWORD(message->lParam);
        const int CtrlMod = MOD_CONTROL;
        const int CtrlShiftMod = MOD_CONTROL | MOD_SHIFT;

        if ((virtualKeyCode == VK_F2) && (modifiers == CtrlMod))
        {
            if (!m_actXXXMode->isChecked())
            {
                m_actXXXMode->activate(QAction::Trigger);
            }
        }
        if ((virtualKeyCode == VK_F2) && (modifiers == CtrlShiftMod))
        {
            if (m_actXXXMode->isChecked())
            {
                m_actXXXMode->activate(QAction::Trigger);
            }
        }
    }
    return false;
}

inline void RegisterHotKeyPrivate(HWND winId, UINT modifiers, UINT vk, int& hotKeyId)
{
    int id = (modifiers << 8) | vk;
    BOOL res = ::RegisterHotKey(winId, id, modifiers, vk);

    if (res != FALSE)
        hotKeyId = id;
}

void MyForm::registerHotKey()
{
    if (m_hotKeyId1 || m_hotKeyId2)
        unregisterHotKey();

    UINT modifiers = MOD_CONTROL; // MOD_ALT, MOD_CONTROL, MOD_SHIFT, MOD_WIN
    UINT vk = VK_F2;
    RegisterHotKeyPrivate((HWND)winId(), modifiers, vk, m_hotKeyId1);

    modifiers = MOD_CONTROL | MOD_SHIFT;
    RegisterHotKeyPrivate((HWND)winId(), modifiers, vk, m_hotKeyId2);
}

void MyForm::unregisterHotKey()
{
    if ((m_hotKeyId1 == 0) && (m_hotKeyId2 == 0))
        return;

    ::UnregisterHotKey((HWND)winId(), m_hotKeyId1);
    m_hotKeyId1 = 0;
    ::UnregisterHotKey((HWND)winId(), m_hotKeyId2);
    m_hotKeyId2 = 0;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
jim1406
  опции профиля:
сообщение 30.4.2009, 11:04
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 17.3.2009
Пользователь №: 618

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(DmP @ 30.4.2009, 14:45) *
Вот сделано на основе libqxt, может не очень красиво но работает:
#include <qt_windows.h>

а я windows.h подключал, похоже поэтому и WM_HOTKEY, и MSG оставались "не знакомыми"...
спасибо!
насчет сборки qxt... похоже победил, установив все (qt sdk, qxt) с нуля. Правда теперь Runtime Error на этапе
globalShortcut = new QxtGlobalShortcut(this);
:(

DialogConsole::DialogConsole(QWidget *parent)
    : QDialog(parent), ui(new Ui::DialogConsole)
{
    ui->setupUi(this);
    globalShortcut = new QxtGlobalShortcut(this);
    globalShortcut->setShortcut(QKeySequence("Ctrl+Alt+A"));
    connect(globalShortcut, SIGNAL(activated()), this, SLOT(specialShow()));
}


Сообщение отредактировал jim1406 - 30.4.2009, 11:42
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.2.2021, 3:01