getMouseMovePointsEx 函数 (winuser.h)

检索最多 64 个鼠标或笔的先前坐标的历史记录。

语法

int GetMouseMovePointsEx(
  [in]  UINT             cbSize,
  [in]  LPMOUSEMOVEPOINT lppt,
  [out] LPMOUSEMOVEPOINT lpptBuf,
  [in]  int              nBufPoints,
  [in]  DWORD            resolution
);

参数

[in] cbSize

类型: UINT

MOUSEMOVEPOINT 结构的大小(以字节为单位)。

[in] lppt

类型: LPMOUSEMOVEPOINT

指向 MOUSEMOVEPOINT 结构的指针,该结构包含有效鼠标坐标 (屏幕坐标) 。 它还可能包含时间戳。

GetMouseMovePointsEx 函数搜索鼠标坐标历史记录中的点。 如果函数找到该点,它将返回提供点之前的最后 一个 nBufPoint, 并包括提供的点。

如果应用程序提供时间戳, GetMouseMovePointsEx 函数将使用它来区分在不同时间记录的两个等点。

应用程序应使用从 WM_MOUSEMOVE 消息接收的鼠标坐标调用此函数,并将其转换为屏幕坐标。

[out] lpptBuf

类型: LPMOUSEMOVEPOINT

指向将接收点的缓冲区的指针。 它的大小至少应为 cbSize* nBufPoints

[in] nBufPoints

类型: int

要检索的点数。

[in] resolution

类型:DWORD

所需的分辨率。 此参数的取值可为下列值之一:

含义
GMMP_USE_DISPLAY_POINTS
1
使用显示分辨率检索点。
GMMP_USE_HIGH_RESOLUTION_POINTS
2
检索高分辨率点。 x 坐标和 y 坐标中的点范围为 0 到 65,535 (0xFFFF) 。 这是绝对坐标指向设备(如绘图平板电脑)提供的分辨率。

返回值

类型: int

如果函数成功,则返回值为缓冲区中的点数。 否则,该函数返回 –1。 对于扩展的错误信息,应用程序可以调用 GetLastError

注解

系统保留最后 64 个鼠标坐标及其时间戳。 如果应用程序向 GetMouseMovePointsEx 提供鼠标坐标,并且坐标存在于系统的鼠标坐标历史记录中,则函数将从系统的历史记录中检索指定数量的坐标。 还可以提供时间戳,用于区分历史记录中的相同点。

GetMouseMovePointsEx 函数将返回最终不仅调度到调用线程的点,还会返回其他线程的点。

在以下情况下,GetMouseMovePointsEx 可能会失败或返回错误值:

  • 如果在 MOUSEMOVEPOINT 结构中传递负坐标。
  • 如果 GetMouseMovePointsEx 检索具有负值的坐标。
如果存在多个监视器,则可能会出现这些情况。 若要更正此问题,请首先调用 GetSystemMetrics 以获取以下值:
  • SM_XVIRTUALSCREEN,
  • SM_YVIRTUALSCREEN,
  • SM_CXVIRTUALSCREEN和
  • SM_CYVIRTUALSCREEN。
然后,对于从 GetMouseMovePointsEx 返回的每个点,执行以下转换:
int nVirtualWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN) ;
int nVirtualHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN) ;
int nVirtualLeft = GetSystemMetrics(SM_XVIRTUALSCREEN) ;
int nVirtualTop = GetSystemMetrics(SM_YVIRTUALSCREEN) ;
int cpt = 0 ;
int mode = GMMP_USE_DISPLAY_POINTS ;

MOUSEMOVEPOINT mp_in ;
MOUSEMOVEPOINT mp_out[64] ;

ZeroMemory(&mp_in, sizeof(mp_in)) ;
mp_in.x = pt.x & 0x0000FFFF ;//Ensure that this number will pass through.
mp_in.y = pt.y & 0x0000FFFF ;
cpt = GetMouseMovePointsEx(&mp_in, &mp_out, 64, mode) ;

for (int i = 0; i < cpt; i++)
{
   switch(mode)
   {
   case GMMP_USE_DISPLAY_POINTS:
      if (mp_out[i].x > 32767)
         mp_out[i].x -= 65536 ;
      if (mp_out[i].y > 32767)
         mp_out[i].y -= 65536 ;
      break ;
   case GMMP_USE_HIGH_RESOLUTION_POINTS:
      mp_out[i].x = ((mp_out[i].x * (nVirtualWidth - 1)) - (nVirtualLeft * 65536)) / nVirtualWidth ;
      mp_out[i].y = ((mp_out[i].y * (nVirtualHeight - 1)) - (nVirtualTop * 65536)) / nVirtualHeight ;
      break ;
   }
} 

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 winuser.h (包括 Windows.h)
Library User32.lib
DLL User32.dll

请参阅

概念性

MOUSEMOVEPOINT

鼠标输入

引用