This snippet shows how to use hooks to stop the cursor from entering a certain area of the screen. This example will stop the cursor from going over 300 pixels away from the centre of the screen by using a bit of maths.
Trapping the mouse (using mouse hooks)
/*
* Make sure project type is windows application
*/
#define _WIN32_WINNT 0x0500
#include<windows.h>
#include<cmath>
LRESULT CALLBACK mouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
// Get event information
PMSLLHOOKSTRUCT p = (PMSLLHOOKSTRUCT) lParam;
bool eat = false;
// Screen resolution
static float screen_cx = static_cast<float>( GetSystemMetrics(SM_CXSCREEN) );
static float screen_cy = static_cast<float>( GetSystemMetrics(SM_CYSCREEN) );
// Centre of screen
static float screen_centre_x = screen_cx / 2.0f;
static float screen_centre_y = screen_cy / 2.0f;
// Calculate distance away from centre of screen
float dx = p->pt.x - screen_centre_x;
float dy = p->pt.y - screen_centre_y;
float dist = sqrt(dx * dx + dy * dy);
// Check if cursor is more than 300px away from centre of screen
if (dist > 300) {
float angle = atan2(dy, dx);
// Trap cursor
SetCursorPos(
/* X */ int( screen_centre_x + cos(angle) * 300 ),
/* Y */ int( screen_centre_y + sin(angle) * 300 )
);
// Stop windows handling event
eat = true;
}
return (eat ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam));
}
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd) {
// Set mouse hook
HHOOK mouseHook = SetWindowsHookEx(
WH_MOUSE_LL, /* Type of hook */
mouseHookProc, /* Hook process */
hInstance, /* Instance */
NULL);
// Wait for user to exit
MessageBox(NULL, "Press OK to close.", "", MB_OK);
return 0;
}
Be a part of the DaniWeb community
We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.