crossplatform.ru

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

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


Студент
*

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

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




Репутация:   0  


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


Студент
*

Группа: Участник
Сообщений: 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;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 18.4.2024, 21:29