Trapping the mouse (using mouse hooks)

William Hemsworth 0 Tallied Votes 728 Views Share

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.

/*
 *  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;
}