Доброго времени суток!
Нужно перехватить глобальное клавиатурное сочетание в Windows. Подскажите, как это сделать? (без сторонней библиотеки).
Qt 4.5
CONFIG += qxt
QXT += core gui
CONFIG += qxt
# QXT += core gui
#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;
}
#include <qt_windows.h>
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()));
}