在網上找了很長時間,你們都提到了一個QT全局熱鍵庫(qxtglobalshortcut),支持跨平臺。在這篇文章中,我將只展現出windows平臺下全局熱鍵的設置。
這裏提供的方法是在MyGlobalShortCut裏面完成Windows的API封裝,並在main.cpp中使用。
直接上代碼:
MyWinEventFilter類:windows
class MyWinEventFilter :public QAbstractNativeEventFilter
{
public:app
MyWinEventFilter(MyGlobalShortCut *shortcut); ~MyWinEventFilter(); virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long*);
private:函數
MyGlobalShortCut *m_shortcut;
};ui
MyWinEventFilter::MyWinEventFilter(MyGlobalShortCut* shortcut) :m_shortcut(shortcut)
{}
MyWinEventFilter::~MyWinEventFilter()
{}
bool MyWinEventFilter::nativeEventFilter(const QByteArray &eventType, void message, long)
{this
MSG *msg = static_cast(message);//static_cast<MSG*>(message)(把這段替換) if (msg->message == WM_HOTKEY) { const quint32 keycode = HIWORD(msg->lParam); const quint32 modifiers = LOWORD(msg->lParam); bool res = m_shortcut->shortcuts.value(qMakePair(keycode, modifiers)); if (res) { m_shortcut->activateShortcut(); return true; } } return false;
}
MyGlobalShortCut類:
class MyGlobalShortCut :public QObject
{
Q_OBJECT
public:spa
MyGlobalShortCut(QKeySequence key); ~MyGlobalShortCut(); void activateShortcut(); bool registerHotKey(); bool unregisterHotKey(); QHash<QPair<quint32, quint32>, MyGlobalShortCut*> shortcuts;
private:.net
QApplication *m_app; MyWinEventFilter *m_filter; QKeySequence m_key; Qt::Key key; Qt::KeyboardModifiers mods; static quint32 nativeKeycode(Qt::Key keycode); static quint32 nativeModifiers(Qt::KeyboardModifiers modifiers);
signals:code
void activated();
};blog
MyGlobalShortCut::MyGlobalShortCut(QKeySequence key)
{it
m_key = QKeySequence(key); m_filter = new MyWinEventFilter(this); m_app->installNativeEventFilter(m_filter); registerHotKey();
}
MyGlobalShortCut::~MyGlobalShortCut()
{
unregisterHotKey();
}
void MyGlobalShortCut::activateShortcut()
{
emit activated();
}
bool MyGlobalShortCut::registerHotKey()
{
Qt::KeyboardModifiers allMods = Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier; key = (m_key.isEmpty() ? Qt::Key(0) : Qt::Key((m_key[0] ^ allMods) & m_key[0])); mods = m_key.isEmpty() ? Qt::KeyboardModifiers(0) : Qt::KeyboardModifiers(m_key[0] & allMods); const quint32 nativeKey = nativeKeycode(key); const quint32 nativeMods = nativeModifiers(mods); shortcuts.insert(qMakePair(nativeKey, nativeMods), this); return RegisterHotKey(0, nativeMods ^ nativeKey, nativeMods, nativeKey);
}
bool MyGlobalShortCut::unregisterHotKey()
{
return UnregisterHotKey(0, (quint32)nativeModifiers(mods) ^ (quint32)nativeKeycode(key));
}
quint32 MyGlobalShortCut::nativeKeycode(Qt::Key key)
{
switch (key) { case Qt::Key_Escape: return VK_ESCAPE; case Qt::Key_Tab: case Qt::Key_Backtab: return VK_TAB; case Qt::Key_Backspace: return VK_BACK; case Qt::Key_Return: case Qt::Key_Enter: return VK_RETURN; case Qt::Key_Insert: return VK_INSERT; case Qt::Key_Delete: return VK_DELETE; case Qt::Key_Pause: return VK_PAUSE; case Qt::Key_Print: return VK_PRINT; case Qt::Key_Clear: return VK_CLEAR; case Qt::Key_Home: return VK_HOME; case Qt::Key_End: return VK_END; case Qt::Key_Left: return VK_LEFT; case Qt::Key_Up: return VK_UP; case Qt::Key_Right: return VK_RIGHT; case Qt::Key_Down: return VK_DOWN; case Qt::Key_PageUp: return VK_PRIOR; case Qt::Key_PageDown: return VK_NEXT; case Qt::Key_F1: return VK_F1; case Qt::Key_F2: return VK_F2; case Qt::Key_F3: return VK_F3; case Qt::Key_F4: return VK_F4; case Qt::Key_F5: return VK_F5; case Qt::Key_F6: return VK_F6; case Qt::Key_F7: return VK_F7; case Qt::Key_F8: return VK_F8; case Qt::Key_F9: return VK_F9; case Qt::Key_F10: return VK_F10; case Qt::Key_F11: return VK_F11; case Qt::Key_F12: return VK_F12; case Qt::Key_F13: return VK_F13; case Qt::Key_F14: return VK_F14; case Qt::Key_F15: return VK_F15; case Qt::Key_F16: return VK_F16; case Qt::Key_F17: return VK_F17; case Qt::Key_F18: return VK_F18; case Qt::Key_F19: return VK_F19; case Qt::Key_F20: return VK_F20; case Qt::Key_F21: return VK_F21; case Qt::Key_F22: return VK_F22; case Qt::Key_F23: return VK_F23; case Qt::Key_F24: return VK_F24; case Qt::Key_Space: return VK_SPACE; case Qt::Key_Asterisk: return VK_MULTIPLY; case Qt::Key_Plus: return VK_ADD; case Qt::Key_Comma: return VK_SEPARATOR; case Qt::Key_Minus: return VK_SUBTRACT; case Qt::Key_Slash: return VK_DIVIDE; // numbers case Qt::Key_0: case Qt::Key_1: case Qt::Key_2: case Qt::Key_3: case Qt::Key_4: case Qt::Key_5: case Qt::Key_6: case Qt::Key_7: case Qt::Key_8: case Qt::Key_9: return key; // letters case Qt::Key_A: case Qt::Key_B: case Qt::Key_C: case Qt::Key_D: case Qt::Key_E: case Qt::Key_F: case Qt::Key_G: case Qt::Key_H: case Qt::Key_I: case Qt::Key_J: case Qt::Key_K: case Qt::Key_L: case Qt::Key_M: case Qt::Key_N: case Qt::Key_O: case Qt::Key_P: case Qt::Key_Q: case Qt::Key_R: case Qt::Key_S: case Qt::Key_T: case Qt::Key_U: case Qt::Key_V: case Qt::Key_W: case Qt::Key_X: case Qt::Key_Y: case Qt::Key_Z: return key; default: return 0; }
}
quint32 MyGlobalShortCut::nativeModifiers(Qt::KeyboardModifiers modifiers)
{
// MOD_ALT, MOD_CONTROL, (MOD_KEYUP), MOD_SHIFT, MOD_WIN quint32 native = 0; if (modifiers & Qt::ShiftModifier) native |= MOD_SHIFT; if (modifiers & Qt::ControlModifier) native |= MOD_CONTROL; if (modifiers & Qt::AltModifier) native |= MOD_ALT; if (modifiers & Qt::MetaModifier) native |= MOD_WIN; return native;
}
//////////////////////////////////////////////////////////////////////////////////////////////
上面是類的封裝,下面是使用:
在main()函數中加入:
QKeySequence keySequence=QKeySequence(tr(「ALT+A」));//設置快捷鍵ALT+A
MyGlobalShortCut *shortcut=new MyGlobalShortCut(keySequence);
connect(shortcut,SIGNAL(activated()),this,SLOT(onActivated()));
onActivated()
{
//全局熱鍵被激活以後要作的事
}
這只是針對windows系統的實現,因爲工做中如今只涉及windows,其餘系統相似,主要就是實現nativeEventFilter()方法。
/////////////////////////////////////////////////////////////////////////////////////////////
(全文完)
http://blog.csdn.net/u011915578/article/details/46491055