Folco (./114) :Parce que QByteArray n'est probablement déclaré qu'en avance (suffisant si on n'utilise que des const QByteArray &) et le header QByteArray n'est pas inclus.
Pourquoi quand j'écris ça :bool NativeEventFilter::nativeEventFilter(const QByteArray& eventType, void* message, long*) { if (eventType == "windows_dispatcher_MSG") { return true; } return false; }J'ai cette erreur :
NativeEventFilter.cpp:10: erreur : no match for 'operator==' (operand types are 'const QByteArray' and 'const char [23]')
Par contre, si j'inclus <QLocalServer>, ça passe, operator== semble défini pour mes besoins (je me suis rendu compte de ça en googlant). Quelle est la solution propre, qui évite d'inclure un header random ?#include <QByteArray>
EDIT -> Bon oubliez, ça marche sans que je comprenne pourquoi...C'est quand-même mieux de comprendre pourquoi.
Folco (./116) :Attention, tu leakes un pointeur vers une variable locale, ce n'est généralement pas une bonne idée! Ça passe si tu es dans main (parce que dans ce cas, la variable locale va durer jusqu'à la fin du programme), mais n'essaie pas de faire ça dans une fonction qui retourne tout de suite.// Install a native event filter and register a hotkey NativeEventFilter nef; filter = &nef; app.installNativeEventFilter(filter);
[...] et qu'un thread d'interface je sais pas comment le trouver ^^Avec Qt, par défaut, le thread d'interface est le thread principal.
Folco (./122) :Comme je l'ai dit, dans main, ça passe (parce que cette fonction ne termine normalement qu'à la fin du programme), mais si tu fais ça dans une autre fonction, ça va foirer à 99%.
Pour le pointeur, c'est en fait une chose que je fais couramment : une variable locale à dans main(), et une variable globale dans main.cpp, qui pointe sur ma variable globale.C'est dangereux ? Je devrais avoir directement ma variable dans l'espace global, avec une allocation sur le tas ?
NativeEventFilter* native_event_filter; int main(int argc, char* argv[]) { QApplication app(argc, argv); // Install a native event filter native_event_filter = new NativeEventFilter; app.installNativeEventFilter(native_event_filter);(j'ai même bien suivi vos conseils sur les vars globales
bool NativeEventFilter::nativeEventFilter(const QByteArray& eventType, void* message, long*) { if (eventType == "windows_dispatcher_MSG") { MSG* msg = static_cast<MSG*>(message); if (msg->message == WM_HOTKEY) { emit hotkeyPressed(); return true; } } return false; }Et dans le constructeur de ma MainWindow, j'installe la hotkey. Du moins j'essaye, parce que ça a pas l'air de cartonner
// Register an hotkey RegisterHotKey((HWND)winId(), 1, MOD_ALT | 0x4000, 0x42);Et donc devant vos yeux ébahis, ben il ne se passe strictement rien. Nada. Que dalle.Malheureusement, j'ai pas de violon, sinon j'aurais essayé de pisser dedans, faute de mieux.
GoldenCrystal (./131) :(oui, c'est ce que je pense aussi et ça marche bien avec les anciennes versions de Windows, mais j'imagine que c'est aussi ce que font les softs que j'ai trouvés. Or vu qu'ils ne semblent plus marcher, il doit y avoir une subtilité...)
(Étape 1: Écrire dans une DLL un WindowProc pour sous-classer une fenêtre, Étape 2: Écrire du code pour injecter la dite DLL dans un process cible, Étape 3: Profit)
MSG* msg = static_cast<MSG*>(message); count++; qDebug() << QString("Event count: %1. Message: %2").arg(count).arg(msg->message); if (msg->message == WM_HOTKEY)Je reçois donc des milliers d'event, la majorité ce sont des #1025 (décimal), parfois des #275. Je les reçois quand la souris bouge, au survol des widgets, au redimensionnement, quand un timer expire etc...
#include <QCoreApplication> #include "windows.h" #include <QDebug> int main(int argc, char *argv[]) { if (RegisterHotKey(NULL, 1, MOD_ALT | 0x4000, 0x42)) //0x42 is 'b' { //_tprintf(_T("Hotkey 'ALT+b' registered, using MOD_NOREPEAT flag\n")); qDebug() << "Hotkey 'ALT+b' registered, using MOD_NOREPEAT flag"; } MSG msg = {0}; while (GetMessage(&msg, NULL, 0, 0) != 0) { if (msg.message == WM_HOTKEY) { //_tprintf(_T("WM_HOTKEY received\n")); qDebug() << "WM_HOTKEY received"; } } return 0; }C'est un bête copier/coller du code d'exmple de MS, sauf que j'ai remplacé tprintf (sékoiça ??) avec un qDebug(). Ca marche à au poil.
#include <QAbstractNativeEventFilter> #include <QCoreApplication> #include <QDebug> #include "windows.h" class NativeEventFilter: public QAbstractNativeEventFilter { public: bool nativeEventFilter(const QByteArray& eventType, void* message, long*) { if (eventType == "windows_dispatcher_MSG") { MSG* msg = static_cast<MSG*>(message); qDebug() << QString("Message: %1").arg(msg->message); if (msg->message == WM_HOTKEY) { qDebug() << QString("Event WM_HOTKEY received"); return true; } } return false; } }; int main(int argc, char *argv[]) { if (RegisterHotKey(NULL, 1, MOD_ALT | 0x4000, 0x42)) //0x42 is 'b' { qDebug() << "Hotkey 'ALT+b' registered, using MOD_NOREPEAT flag"; } QCoreApplication app(argc, argv); NativeEventFilter* nef = new NativeEventFilter; app.installNativeEventFilter(nef); return app.exec(); }je crois que c'est pas la peine d'essayer avec une fenêtre si j'arrive pas à faire marcher un code aussi basique que ça ?
QAbstractEventDispatcher also allows the integration of an external event loop with the Qt event loop.On va tenter, même si les explications sont encore un peu confusantes à mes yeux. Merci, au moins j'ai du pain sur la planche
QAbstractEventDispatcher ClassÇa sous-entendait que le dispatcher pouvait manger des évènements (j'ai toujours l'impression que c'est le cas, d'ailleurs).
The QAbstractEventDispatcher class provides an interface to manage Qt's event queue.
An event dispatcher receives events from the window system and other sources. It then sends them to the QCoreApplication or QApplication instance for processing and delivery. QAbstractEventDispatcher provides fine-grained control over event delivery.
On Windows, eventType is set to "windows_generic_MSGMaintenant, pourquoi tu ne vois pas passer les messages de HotKey dans le cas global… Je ne sais pas encore.
" for messages sent to toplevel windows, and "windows_dispatcher_MSG" for system-wide messages