dwExtraInfo 为 PMOUSEHOOKSTRUCT 保留了哪些信息?

What information does dwExtraInfo hold for the PMOUSEHOOKSTRUCT?

LRESULT CALLBACK LowLevelMouseProc(_In_ int nCode, _In_ WPARAM wParam, _In_ LPARAM lParam)
{
    BOOL fpassmove = FALSE;

    if (nCode == HC_ACTION)
    {
        switch (wParam)
        {
            
            case WM_MOUSEMOVE: // how do i catch a dx instead of a cursor points?


                
                PMOUSEHOOKSTRUCT me = (PMOUSEHOOKSTRUCT)lParam;
                
                printf("x:%d\ny:%d\nextrainfo:%04X\n", me->pt.x,me->pt.y, me->dwExtraInfo );
                break;
        }
    }
    return(fpassmove ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam));
}

int main()
{
    // Install the low-level keyboard & mouse hooks
    HHOOK hhkLowLevelMouse = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, 0, 0);
    // Keep this app running until we're told to stop
    MSG msg;
    while (!GetMessage(&msg, NULL, NULL, NULL)) {    //this while loop keeps the hook
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    UnhookWindowsHookEx(hhkLowLevelMouse);

    return(0);
}

我正在从全局挂钩查看所有鼠标时刻,我试图找到鼠标事件的 dx 和 dy,我希望在“dwExtraInfo”中找到它。但是,我不知道如何理解“dwExtraInfo”中的数据。

windows 文档无法告诉我 dwExtraInfo 中数据的含义

dwExtraInfo

Type: ULONG_PTR

Additional information associated with the message.

无法直接在 dwExtraInfo 上找到任何文档,但找到了相关内容:https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getmessageextrainfo:

Return value

Type: LPARAM

The return value specifies the extra information. The meaning of the extra information is device specific.

此类设备特定的额外信息的一个示例是笔手势:https://docs.microsoft.com/en-us/windows/win32/tablet/system-events-and-mouse-messages

Distinguishing Pen Input from Mouse and Touch

When your application receives a mouse message (such as WM_LBUTTONDOWN), it may call the GetMessageExtraInfo function to evaluate whether the message originated from a pen or a mouse device.

The value returned from GetMessageExtraInfo needs to be mask-checked against 0xFFFFFF00, and then compared with 0xFF515700. The following definitions may make this clearer:

#define MI_WP_SIGNATURE  0xFF515700
#define SIGNATURE_MASK   0xFFFFFF00
#define IsPenEvent(dw)   (((dw) & SIGNATURE_MASK) == MI_WP_SIGNATURE

If the comparison is true, then this mouse message was generated by a Tablet PC pen or touch screen. In all other cases, you can assume that this message was generated by a mouse device.

The lower 8 bits returned from GetMessageExtraInfo are variable. Of those bits, 7 (the lower 7, masked by 0x7F) are used to represent the cursor ID, zero for the mouse or a variable value for the pen ID. Additionally, in Windows Vista, the eighth bit, masked by 0x80, is used to differentiate touch input from pen input (0 = pen, 1 = touch).