deactivate hook with qobject
-
Hi i'm connecting to my external class with qobject to check mouse event's . But when i try to deactivate the hook with emit instance().event(); doesnt seem's to work the problem seem .this dont call signal. Obviously when i do this :
mouseHook = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, hInstance, 0); UnhookWindowsHookEx(mouseHook);
Stop me the hook. But the signal never is called?¿
Code:
main.cpp:#include <QCoreApplication> #include <QDebug> #include "mouselogger.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QObject::connect(&MouseLogger::instance(), &MouseLogger::mouseEvent, [](){ }); return a.exec(); }
mouse.cpp:
#include "mouselogger.h" #include <QDebug> MouseLogger &MouseLogger::instance() { static MouseLogger _instance; return _instance; } MouseLogger::MouseLogger(QObject *parent) : QObject(parent) { HINSTANCE hInstance = GetModuleHandle(NULL); // Set hook //mouseHook = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, hInstance, 0); // Check hook is correctly //if (mouseHook == NULL) { // qWarning() << "Mouse Hook failed"; //} } LRESULT CALLBACK MouseLogger::mouseProc(int Code, WPARAM wParam, LPARAM lParam) { Q_UNUSED(Code) // Having an event hook, we nned to cast argument lParam // to the structure of the mouse is the hook. MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lParam; // Next, we check to see what kind of event occurred, // if the structure is not a pointer to nullptr if(pMouseStruct != nullptr) { switch (wParam) { case WM_MOUSEMOVE: qDebug() << "WM_MOUSEMOVE"; break; case WM_LBUTTONDOWN: qDebug() << "WM_LBUTTONDOWN"; break; case WM_LBUTTONUP: qDebug() << "WM_LBUTTONUP"; break; case WM_RBUTTONDOWN: qDebug() << "WM_RBUTTONDOWN"; break; case WM_RBUTTONUP: qDebug() << "WM_RBUTTONUP"; break; case WM_MBUTTONDOWN: qDebug() << "WM_MBUTTONDOWN"; break; case WM_MBUTTONUP: qDebug() << "WM_MBUTTONUP"; break; case WM_MOUSEWHEEL: qDebug() << "WM_MOUSEWHEEL"; break; default: break; } emit instance().mouseEvent(); } // After that you need to return back to the chain hook event handlers return CallNextHookEx(NULL, Code, wParam, lParam); }
mouse.h:
#ifndef MOUSELOGGER_H #define MOUSELOGGER_H #include <QObject> #include <windows.h> class MouseLogger : public QObject { Q_OBJECT Q_DISABLE_COPY(MouseLogger) public: static MouseLogger &instance(); explicit MouseLogger(QObject *parent = nullptr); virtual ~MouseLogger(){} // Static method that will act as a callback-function static LRESULT CALLBACK mouseProc(int Code, WPARAM wParam, LPARAM lParam); signals: // The signal, which will report the occurrence of an event void mouseEvent(); void Eventos(); public slots: private: // hook handler HHOOK mouseHook; }; #endif // MOUSELOGGER_H
-
hi
emit instance().event() ---> emit instance().Eventos();Would emit a signal.
I dont see you have this signal hooked up to any slot ?
-
hi
emit instance().event() ---> emit instance().Eventos();Would emit a signal.
I dont see you have this signal hooked up to any slot ?
@mrjj yeah i didnt include because when i do this:
QObject::connect(&MouseLogger::instance(), &MouseLogger::mouseEvent,
{});
The signal never is emitted. In other words , i want to call the signal but i think like you say me i need to include some slot first? to be emitted first.
Ok i tried to do this creating slot define the slot:
void MouseLogger::parada(){
qDebug() << "test";
emit instance().mouseEvent();}
and call with:QObject::connect(&MouseLogger::instance(), &MouseLogger::mouseEvent,
{});
Not seem's to show nothing?
-
@mrjj yeah i didnt include because when i do this:
QObject::connect(&MouseLogger::instance(), &MouseLogger::mouseEvent,
{});
The signal never is emitted. In other words , i want to call the signal but i think like you say me i need to include some slot first? to be emitted first.
Ok i tried to do this creating slot define the slot:
void MouseLogger::parada(){
qDebug() << "test";
emit instance().mouseEvent();}
and call with:QObject::connect(&MouseLogger::instance(), &MouseLogger::mouseEvent,
{});
Not seem's to show nothing?
-
Since its your signal. you defined it.
You must also emit it.
and if no slot is connected, nothing happens.So you did call
MouseLogger::instance().parada() from main?@mrjj i tried this but not seem's to work i'm trying to use qobject because the class is separated.
But anyways not seem's to stop my hook:
Main.cpp:#include <QCoreApplication> #include <QDebug> #include "mouselogger.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QObject::connect(&MouseLogger::instance(), &MouseLogger::mouseEvent, [](){ }); return a.exec(); }
mouse.cpp:
#include "mouselogger.h" #include <QDebug> MouseLogger &MouseLogger::instance() { static MouseLogger _instance; return _instance; } MouseLogger::MouseLogger(QObject *parent) : QObject(parent) { HINSTANCE hInstance = GetModuleHandle(NULL); //Set hook mouseHook = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, hInstance, 0); // Check hook is correctly if (mouseHook == NULL) { qWarning() << "Mouse Hook failed"; } } void MouseLogger::parada(){ mouseHook = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, hInstance, 0); UnhookWindowsHookEx(mouseHook); emit instance().mouseEvent(); } LRESULT CALLBACK MouseLogger::mouseProc(int Code, WPARAM wParam, LPARAM lParam) { Q_UNUSED(Code) // Having an event hook, we nned to cast argument lParam // to the structure of the mouse is the hook. MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lParam; // Next, we check to see what kind of event occurred, // if the structure is not a pointer to nullptr if(pMouseStruct != nullptr) { switch (wParam) { case WM_MOUSEMOVE: qDebug() << "WM_MOUSEMOVE"; break; case WM_LBUTTONDOWN: qDebug() << "WM_LBUTTONDOWN"; break; case WM_LBUTTONUP: qDebug() << "WM_LBUTTONUP"; break; case WM_RBUTTONDOWN: qDebug() << "WM_RBUTTONDOWN"; break; case WM_RBUTTONUP: qDebug() << "WM_RBUTTONUP"; break; case WM_MBUTTONDOWN: qDebug() << "WM_MBUTTONDOWN"; break; case WM_MBUTTONUP: qDebug() << "WM_MBUTTONUP"; break; case WM_MOUSEWHEEL: qDebug() << "WM_MOUSEWHEEL"; break; default: break; } } // After that you need to return back to the chain hook event handlers return CallNextHookEx(NULL, Code, wParam, lParam); }
mouse.h:
#ifndef MOUSELOGGER_H #define MOUSELOGGER_H #include <QObject> #include <windows.h> class MouseLogger : public QObject { Q_OBJECT Q_DISABLE_COPY(MouseLogger) public: static MouseLogger &instance(); explicit MouseLogger(QObject *parent = nullptr); virtual ~MouseLogger(){} HINSTANCE hInstance; void parada(); // Static method that will act as a callback-function static LRESULT CALLBACK mouseProc(int Code, WPARAM wParam, LPARAM lParam); signals: // The signal, which will report the occurrence of an event void mouseEvent(); void Eventos(); public slots: private: // hook handler HHOOK mouseHook; }; #endif // MOUSELOGGER_H
-
well you seems to create a new ONE and then stop that , not the one you create in constructor
MouseLogger::MouseLogger(QObject *parent) : QObject(parent)
{
HINSTANCE hInstance = GetModuleHandle(NULL);
//Set hook
mouseHook = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, hInstance, 0); <<< the FIRSTvoid MouseLogger::parada(){
mouseHook = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, hInstance, 0); <<<< NEW ??
UnhookWindowsHookEx(mouseHook);
emit instance().mouseEvent();
}so I would expect it to be
void MouseLogger::parada(){
UnhookWindowsHookEx(mouseHook);
} -
well you seems to create a new ONE and then stop that , not the one you create in constructor
MouseLogger::MouseLogger(QObject *parent) : QObject(parent)
{
HINSTANCE hInstance = GetModuleHandle(NULL);
//Set hook
mouseHook = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, hInstance, 0); <<< the FIRSTvoid MouseLogger::parada(){
mouseHook = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, hInstance, 0); <<<< NEW ??
UnhookWindowsHookEx(mouseHook);
emit instance().mouseEvent();
}so I would expect it to be
void MouseLogger::parada(){
UnhookWindowsHookEx(mouseHook);
} -
@mrjj ok thx one question i can call with this:
MouseLogger::instance().parada();But then qobject can't be used to call parada(), only connect me the signal with the instance only so?