PDA

View Full Version : Catching WM_HOTKEY events



fname
2nd October 2014, 05:59
Hi, first I should specify that I’m using PySide on Windows. I’m rigging together a custom global hotkey solution (there aren’t many existing libraries that have support for global hotkeys) on Win32, which is pretty easy to do. I already have it so that Windows sends my application a standard WM_HOTKEY event (message ID=786). I’ve tried a few ways of catching this event. The first way, which actually worked when using PyQt4, was using QAbstractEventDispatcher with setEventFilter, as exemplified here (http://www.riverbankcomputing.com/pipermail/pyqt/2011-March/029449.html). When message.message is 786, access message.wParam to get the details of which global hotkey was pressed. Success!

However, PySide for some reason does not have a setEventFilter function, so I went looking for other solutions. Installing an event filter on my main window failed, it never gets any messages at all at the point in time at which I press the hotkey (although it does get messages when any non-global-hotkey keys are pressed).

I also failed to create a custom event loop. I can create a loop to call app.processEvents() instead of using app.exec() directly, but what I really need is an infinite loop to catch Win32 events using GetMessage(), which doesn’t really work with my existing loop.

Right now, I’m out of ideas. If only PySide had setEventFilter support… What do you think? Is there some way to catch the WM_HOTKEY event?

anda_skoa
2nd October 2014, 11:33
Since you are using Qt4, maybe overwriting QCoreApplication::winEventFilter()?

Cheers,
_

fname
5th October 2014, 23:18
Thanks, but unfortunately this doesn't work. I can override winEventFilter and print the contents of the MSG events, but such an event is never raised for a WM_HOTKEY event when I press a hotkey from outside the application, the way it is for the method in the link in my first post. (Also, in a well-known bug, PySide's MSG struct is actually broken; you can't access wParam directly, it's only printed when you print the MSG object directly, but that's irrelevant.)

anda_skoa
9th October 2014, 16:20
Then your options are to ask the PySide developers to add the missing functionality and/or fix the broken parts or use PyQt which you already know to work.

The latter seems to be the more viable choice.

Cheers,
_