Консольное приложение:
#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.
Для того, чтобы хуки группы ..._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);
Прекратите указывать hInstance
в вызове SetWindowsHookEx
. В документации ясно сказано, что если обработчик хука находится в текущем процессе, то этот параметр должен быть NULL
.
Что такое
if (wParam >= 0)
? WPARAM
- беззнаковый тип и такое сравнение бессмысленно. Скорее имелось в виду
if (nCode >= 0)
ибо при отрицательном nCode
вы обязаны сразу вызвать CallNextHookEx
.
Как уже указал 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;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Добрый день я являюсь новичком в области C++ и тут возникла интересная проблема совместимости новых библиотек со старыми ОСНапример есть...
Как лучше импортировать вodt из Qt? Есть много примеров как в Word импортировать, но в
В модальном окне есть два поля ввода QLineEditВ первом вводится количество элементов и на него установлен QIntValidator, то есть кроме целого числа...
Написала функцию Hight(int r, int *mas), которая должна вычислять высоту дереваДерево представляется в виде массива чисел, где mas[i] = это родитель i - го ребенка