Глобальный хук на мышь

345
03 ноября 2018, 16:00

Консольное приложение:

#include "stdafx.h"
#include "stdio.h"
#include "Windows.h"
HHOOK myHook;
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (wParam >= 0)
    {
        if (wParam == WM_XBUTTONDOWN)
        {
            printf("X Button pressed.");
        }
    }
    return CallNextHookEx(myHook, nCode, wParam, lParam);
}
int main()
{
    HINSTANCE hInstance = GetModuleHandle(NULL);
    myHook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, hInstance, 0);    
    if (myHook != NULL)
        printf("Hook complited;");
    else
        printf("Hook not complited.");
    system("pause");
    return 0;
}

Проблема в том, что хук не работает.

Ткните пожалуйста меня носом в место, где не правильно, и, если не сложно, подскажите как правильно please.

Answer 1
  1. Для того, чтобы хуки группы ..._LL работали (например WH_MOUSE_LL), ваш процесс должен обрабатывать очередь сообщений

    myHook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, 0, 0);    
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0) > 0)
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
    UnhookWindowsHookEx(myHook);
    
  2. Прекратите указывать hInstance в вызове SetWindowsHookEx. В документации ясно сказано, что если обработчик хука находится в текущем процессе, то этот параметр должен быть NULL.

  3. Что такое

    if (wParam >= 0)
    

    ? WPARAM - беззнаковый тип и такое сравнение бессмысленно. Скорее имелось в виду

    if (nCode >= 0)
    

    ибо при отрицательном nCode вы обязаны сразу вызвать CallNextHookEx.

Answer 2

Как уже указал Ant, у вас нету обработчика сообщений, ниже пример где цикл обработки вынесен в поток

#include "stdafx.h"
#include "stdio.h"
#include "Windows.h"
HHOOK hMouseHook;
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    MOUSEHOOKSTRUCT* pMouseStruct = (MOUSEHOOKSTRUCT*)lParam;
    if (pMouseStruct != NULL)
    {
        if (wParam == WM_LBUTTONDOWN)
        {
            printf("clicked");
        }
        printf("Mouse position X = %d  Mouse Position Y = %d\n", pMouseStruct->pt.x, pMouseStruct->pt.y);
    }
    return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}
DWORD WINAPI MyMouseLogger(LPVOID lpParm)
{
    hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, NULL, 0);
    MSG message;
    while (GetMessage(&message, NULL, 0, 0) > 0)
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
    UnhookWindowsHookEx(hMouseHook);
    return 0;
}
int main(int argc, char** argv)
{
    HANDLE hThread = NULL;
    hThread = CreateThread(NULL, 0, MyMouseLogger, NULL, 0, NULL);
    if (hThread != NULL )
        return WaitForSingleObject(hThread, INFINITE);
    else
        return 1;
}
READ ALSO
C++ Загрузки статической библиотеки.

C++ Загрузки статической библиотеки.

Добрый день я являюсь новичком в области C++ и тут возникла интересная проблема совместимости новых библиотек со старыми ОСНапример есть...

163
Как импортировать в .odt? Qt

Как импортировать в .odt? Qt

Как лучше импортировать вodt из Qt? Есть много примеров как в Word импортировать, но в

142
Проверка корректности ввода

Проверка корректности ввода

В модальном окне есть два поля ввода QLineEditВ первом вводится количество элементов и на него установлен QIntValidator, то есть кроме целого числа...

163
Рекурсивное вычисление высоты дерева

Рекурсивное вычисление высоты дерева

Написала функцию Hight(int r, int *mas), которая должна вычислять высоту дереваДерево представляется в виде массива чисел, где mas[i] = это родитель i - го ребенка

168