Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct
How to hook system events with QAbstractEventDispatcher
ibingow last edited by
These are found in document
EventFilter QAbstractEventDispatcher::setEventFilter ( EventFilter filter ):
Replaces the event filter function for this QAbstractEventDispatcher with filter and returns the replaced event filter function.
The event filter function set here is called for all messages taken from the system event loop before the event is dispatched to the respective target, including the messages not meant for Qt objects.
The event filter function should return true if the message should be filtered, (i.e. stopped). It should return false to allow processing the message to continue.
Is that mean we can catch all system events very easy?
Then i tested it on windows.
class SysEvent : public QObject
explicit SysEvent(QObject *parent = 0);
static bool sysEventFilter(void* message);
static QAbstractEventDispatcher::EventFilter prevEventFilter;
SysEvent::SysEvent(QObject parent) :
prevEventFilter = QAbstractEventDispatcher::instance()->setEventFilter(SysEvent::sysEventFilter);
bool SysEvent::sysEventFilter(void message)
MSG* msg = static_cast<MSG*>(message);
if (msg->message == WM_HOTKEY)
const quint32 keycode = HIWORD(msg->lParam);
const quint32 modifiers = LOWORD(msg->lParam);
qDebug("%d, %d", keycode, modifiers);
but when i run it, sysEventFilter() was called less then 10 times. I think other system event can call sysEventFilter() too. Am i wrong? What is the right way to catch system events with QAbstractEventDispatcher?