PRB: mouse_event and Absolute Moves on Secondary Monitors (193003)



The information in this article applies to:

  • Microsoft Platform Software Development Kit (SDK) 1.0, when used with:
    • the operating system: Microsoft Windows 98

This article was previously published under Q193003

SYMPTOMS

When you use mouse_event with absolute positions on Windows 98, the mouse cursor only moves over the primary monitor. If you try to move the cursor onto a secondary monitor attached to the desktop, the cursor stops at the edge of the primary monitor. Relative mouse movements move the cursor to the primary or secondary monitor as appropriate. The behavior of moving the cursor over an area of the desktop that is not on any monitor is undefined.

CAUSE

This behavior is by design for backward compatibility with Windows 95.

RESOLUTION

In some cases, this behavior is not desired. You can use the following sample code to emulate absolute movement over the entire virtual desktop:

Sample Code

// Visual C++ 5.0 does not define these constants. Visual C++ 6.0 does,
// so you need to allow for both possibilities.
#ifndef SPI_GETMOUSESPEED
#define SPI_GETMOUSESPEED   112
#endif

#ifndef SPI_SETMOUSESPEED
#define   SPI_SETMOUSESPEED   113
#endif

   int oldAccel[3], newAccel[3], oldSpeed, newSpeed, x, y;
   BOOL bResult;

   // The following values set mouse ballistics to 1 mickey/pixel.
   newAccel[0] = 0;
   newAccel[1] = 0;
   newAccel[2] = 0;
   newSpeed = 1;

   // Save the Current Mouse Acceleration Constants
   bResult = SystemParametersInfo(SPI_GETMOUSE,0, oldAccel,0);
   bResult = SystemParametersInfo(SPI_GETMOUSESPEED, 0, &oldSpeed,0);

   // Set the new Mouse Acceleration Constants (Disabled).
   bResult = SystemParametersInfo(SPI_SETMOUSE, 0, newAccel, 
                                  SPIF_SENDCHANGE);
   bResult = SystemParametersInfo(SPI_SETMOUSESPEED, 0, newSpeed, 
                                  SPIF_SENDCHANGE);

   //Pick some arbitrary x & y values.
   x = -100;
   y = -150;

   // Move cursor to UL of primary monitor (origin).
   mouse_event(MOUSEEVENTF_ABSOLUTE,0,0,0,0);

   // Move the cursor to the desired coordinates.
   mouse_event(0,x,y,0,0);

   // Restore the old Mouse Acceleration Constants.
   bResult = SystemParametersInfo(SPI_SETMOUSE,0, oldAccel, 
                                  SPIF_SENDCHANGE);
   bResult = SystemParametersInfo(SPI_SETMOUSESPEED, 0, oldSpeed, 
                                  SPIF_SENDCHANGE);
				

MORE INFORMATION

Windows NT allows absolute mouse moves onto any monitor that is part of the desktop.

Modification Type:MinorLast Reviewed:7/11/2005
Keywords:kbcode kbInput kbprb KB193003