Mouse program with windows hook
-
Hi i am searching info because i'm improving one mouseevent program. At the momen't could unistall with:
UnhookWindowsHookEx(hHook);But if i want that the event's work again, how i can install again? So the problem is when i use this:
MouseLogger::instance().parada();
And i connect again, the mouse program doesnt work more,like:
QObject::connect(&MouseLogger::instance(), &MouseLogger::mouseEvent, [](){ });
Program:
#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(){ UnhookWindowsHookEx(mouseHook); } 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); }