WM_POINTERUPDATE 消息

发布后,在指针上提供更新,该指针在窗口的工作区上或悬停在窗口的工作区上的悬停未捕获的指针上。 指针悬停时,消息将针对指针碰巧超过的窗口。 当指针与图面接触时,指针将隐式捕获到指针进行接触的窗口,并且该窗口继续接收指针的输入,直到中断联系人。

[!重要提示]
桌面应用应感知 DPI。 如果你的应用无法识别 DPI,则指针消息中包含的屏幕坐标和相关结构可能会由于 DPI 虚拟化而显示不准确。 DPI 虚拟化为不识别 DPI 的应用程序提供自动缩放支持,并且默认情况下处于活动状态, (用户可以将其关闭) 。 有关详细信息,请参阅 编写高 DPI Win32 应用程序

#define WM_POINTERUPDATE              0x0245

参数

wParam

包含有关指针的信息。 使用以下宏从 wParam 参数检索信息。

  • GET_POINTERID_WPARAM (wParam) :指针标识符。

  • IS_POINTER_NEW_WPARAM (wParam) :指示此消息是否表示由新指针生成的第一个输入的标志。

  • IS_POINTER_INRANGE_WPARAM (wParam) :一个标志,指示此消息是否由指针在其生存期内生成。 此标志未在指示指针具有左检测范围的消息上设置

  • IS_POINTER_INCONTACT_WPARAM (wParam) :一个标志,指示此消息是否由与窗口图面接触的指针生成。 此标志未在指示悬停指针的消息上设置。

  • IS_POINTER_PRIMARY_WPARAM (wParam) :指示此指针已指定为主指针。

  • IS_POINTER_FIRSTBUTTON_WPARAM (wParam) :指示是否存在主操作的标志。

    • 这类似于鼠标左键向下。
    • 触摸指针在与数字化器图面接触时将具有此设置。
    • 当笔指针与数字化器图面接触且未按下任何按钮时,笔指针将具有此设置。
  • IS_POINTER_SECONDBUTTON_WPARAM wParam) (:指示是否存在辅助操作的标志。

    • 这类似于鼠标右键向下键。
    • 当笔指针与数字化器表面接触并按下笔桶按钮时,笔指针将具有此设置。
  • IS_POINTER_THIRDBUTTON_WPARAM wParam) (:一个标志,指示是否有一个或多个基于指针类型的第三级操作;想要响应第三项操作的应用程序必须检索特定于指针类型的信息,以确定按下哪个第三个按钮。 例如,应用程序可以通过调用 GetPointerPenInfo 并检查指定按钮状态的标志来确定笔的按钮状态。

  • IS_POINTER_FOURTHBUTTON_WPARAM (wParam) :指示指定指针是否执行第四个操作的标志。 要响应第四个操作的应用程序必须检索特定于指针类型的信息,以确定是否按下了第一个扩展鼠标 (XButton1) 按钮。

  • IS_POINTER_FIFTHBUTTON_WPARAM wParam) (:指示指定指针是否执行第五个操作的 标志 。 要响应第五个操作的应用程序必须检索特定于指针类型的信息,以确定是否按下第二个扩展鼠标 (XButton2) 按钮。

    有关更多详细信息 ,请参阅指针标志

    注意

    悬停指针没有设置任何按钮标志。 这类似于鼠标移动,没有鼠标按钮向下移动。 应用程序可以通过调用 GetPointerPenInfo 并检查指定按钮状态的标志来确定悬停笔的按钮状态。

lParam

包含指针的点位置。

注意

由于指针可能通过非简单区域与设备联系,因此此点位置可能是更复杂的指针区域的简化。 尽可能使用完整的指针区域信息,而不是点位置。

使用以下宏检索点的物理屏幕坐标。

返回值

如果应用程序处理此消息,它应返回零。

如果应用程序未处理此消息,则应调用 DefWindowProc

注解

每个指针在其生存期内都有唯一的指针标识符。 指针的生存期在首次检测到指针时开始。

如果检测到悬停指针,则会生成 WM_POINTERENTER 消息。 如果检测到非悬停指针,则会生成 WM_POINTERENTER消息的WM_POINTERDOWN 消息。

在其生存期内,指针可能会在鼠标悬停或联系时生成一系列 WM_POINTERUPDATE 消息。

指针的生存期在不再检测到时结束。 这会生成 WM_POINTERLEAVE 消息。

当指针中止时, 将设置POINTER_FLAG_CANCELED

当非捕获指针在窗口边界外移动时,也可能生成 WM_POINTERLEAVE 消息。

若要获取指针的水平和垂直位置,请使用以下内容:

xPos = GET_X_LPARAM(lParam); 
yPos = GET_Y_LPARAM(lParam);

MAKEPOINTS 宏还可用于将 lParam 参数转换为 POINTS 结构。

GetKeyState 函数可用于确定与此消息关联的键盘修饰键状态。 例如,若要检测按下 ALT 键,请检查 GetKeyState 是否 (VK_MENU) < 0。

如果应用程序未处理此消息, DefWindowProc 可能会生成一个或多个 WM_GESTURE 消息(如果来自此消息的输入序列),并且可能将其他指针识别为手势。 如果未识别手势, DefWindowProc 可能会生成鼠标输入。

如果应用程序有选择地使用某些指针输入并将其余项传递给 DefWindowProc,则生成的行为是未定义的。

使用 GetPointerInfo 函数检索与此消息相关的进一步信息。

如果应用程序不会像生成这些消息一样快地处理这些消息,可能会合并一些移动。 可以使用 GetPointerInfoHistory 函数检索合并到此消息中的输入历史记录。

示例

下面的代码示例演示如何使用 GET_X_LPARAMGET_Y_LPARAMIS_POINTER_FIRSTBUTTON_WPARAMIS_POINTER_SECONDBUTTON_WPARAMWM_POINTERUPDATE 消息的 wParam 和 lParam 参数检索相关信息。

int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);

if (IS_POINTER_PRIMARYBUTTON_WPARAM(wParam))
{
    // process pointer move while down, similar to mouse move with left button down
}
else if (IS_POINTER_SECONDARYBUTTON_WPARAM(wParam))
{
    // process pointer move while down, similar to mouse move with right button down
}

下面的代码示例演示如何使用GET_POINTERID_WPARAM从WM_POINTERUPDATE消息的 wParam 参数检索指针 ID。

POINTER_INFO pointerInfo;
UINT32       pointerId = GET_POINTERID_WPARAM(wParam);

// Retrieve common pointer information
if (!GetPointerInfo(pointerId, &amp;pointerInfo))
{
    // failure, call GetLastError()
}
else
{
    // success, process pointerInfo
}

下面的代码示例演示如何处理不同的指针类型。

POINTER_TOUCH_INFO   touchInfo;
POINTER_PEN_INFO     penInfo;
POINTER_INFO pointerInfo;
UINT32       pointerId = GET_POINTERID_WPARAM(wParam);
POINTER_INPUT_TYPE pointerType = PT_POINTER;

// default to unhandled to enable call to DefWindowProc
fHandled = FALSE;

if (!GetPointerType(pointerId, &pointerType))
{
    // failure, call GetLastError()
    // set PT_POINTER to fall to default case below
    pointerType = PT_POINTER;
}

switch (pointerType)
{
case PT_TOUCH:
    // Retrieve touch information
    if (!GetPointerTouchInfo(pointerId, &touchInfo))
    {
        // failure, call GetLastError()
    }
    else
    {
        // success, process touchInfo
        // mark as handled to skip call to DefWindowProc
        fHandled = TRUE;
    }
    break;
case PT_PEN:
    // Retrieve pen information
    if (!GetPointerPenInfo(pointerId, &penInfo))
    {
        // failure, call GetLastError()
    }
    else
    {
        // success, process penInfo
        // mark as handled to skip call to DefWindowProc
        fHandled = TRUE;
    }
    break;
default:
    if (!GetPointerInfo(pointerId, &pointerInfo)) 
    {
        // failure.
    } 
    else 
    {
        // success, proceed with pointerInfo.
        fHandled = HandleGenericPointerInfo(&pointerInfo);
    }
    break;
}

要求

要求
最低受支持的客户端
Windows 8 [仅限桌面应用]
最低受支持的服务器
Windows Server 2012 [仅限桌面应用]
标头
Winuser.h (包括 Windows.h)

另请参阅

消息

参考

指针标志

GET_POINTERID_WPARAM

IS_POINTER_NEW_WPARAM

IS_POINTER_INRANGE_WPARAM

IS_POINTER_INCONTACT_WPARAM

IS_POINTER_PRIMARY_WPARAM

IS_POINTER_FIRSTBUTTON_WPARAM

IS_POINTER_SECONDBUTTON_WPARAM

IS_POINTER_THIRDBUTTON_WPARAM

IS_POINTER_FOURTHBUTTON_WPARAM

IS_POINTER_FIFTHBUTTON_WPARAM