@R0b0t1;
Out of context, System-Wide:
CPP Code:
#include <windows.h>
#include <iostream>
HHOOK MouseHook = nullptr;
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (lParam)
{
MOUSEHOOKSTRUCT* MouseEvent = (MOUSEHOOKSTRUCT*)lParam;
std::cout << MouseEvent->pt.x << ", " << MouseEvent->pt.y << std::endl;
}
return CallNextHookEx(MouseHook, nCode, wParam, lParam);
}
int main()
{
MouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, nullptr, 0); // 0 for all, anything else filters to that specific thread.
MSG messages;
while (GetMessage(&messages, nullptr, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
UnhookWindowsHookEx(MouseHook);
return 0;
}
In Context:
CPP Code:
#include <windows.h>
#include <iostream>
std::string DLLPath = "C:/Users/Kasi/Desktop/WH_MOUSE_TEST_DLL/bin/Debug/WH_MOUSE_TEST_DLL.dll";
HMODULE HOOK = nullptr;
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
{
HOOK = LoadLibrary(DLLPath.c_str());
}
break;
case WM_DESTROY:
{
FreeLibrary(HOOK);
PostQuitMessage(0);
}
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
int main()
{
WNDCLASSEX wincl;
wincl.hInstance = nullptr;
wincl.lpszClassName = "Example";
wincl.lpfnWndProc = WindowProcedure;
wincl.style = 0;
wincl.cbSize = sizeof(WNDCLASSEX);
wincl.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
wincl.hIconSm = LoadIcon(nullptr, IDI_APPLICATION);
wincl.hCursor = LoadCursor(nullptr, IDC_ARROW);
wincl.lpszMenuName = nullptr;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
if (!RegisterClassEx(&wincl))
return 0;
HWND hwnd = CreateWindowEx(0, "Example", "Title", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
680, 480, HWND_DESKTOP, nullptr, nullptr, nullptr);
ShowWindow(hwnd, SW_SHOW);
MSG messages;
while (GetMessage(&messages, nullptr, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return 0;
}
CPP Code:
#include <windows.h>
#include <iostream>
HHOOK MouseHook = nullptr;
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (lParam)
{
MOUSEHOOKSTRUCT* MouseEvent = (MOUSEHOOKSTRUCT*)lParam;
std::cout << MouseEvent->pt.x << ", " << MouseEvent->pt.y << std::endl;
}
return CallNextHookEx(MouseHook, nCode, wParam, lParam);
}
BOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
{
MouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, GetModuleHandle(nullptr),
GetWindowThreadProcessId(FindWindow(nullptr, "Title"), nullptr));
}
break;
case DLL_PROCESS_DETACH:
{
UnhookWindowsHookEx(MouseHook);
}
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
Apologies for the C style casts and the message pump.