【问题标题】:What information does dwExtraInfo hold for the PMOUSEHOOKSTRUCT?dwExtraInfo 为 PMOUSEHOOKSTRUCT 保存了哪些信息?
【发布时间】:2021-10-01 23:38:14
【问题描述】:
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.

【问题讨论】:

  • 您的代码正在使用WH_MOUSE_LL 挂钩。它的回调不使用MOUSEHOOKSTRUCT(由WH_MOUSE 使用),它使用MSLLHOOKSTRUCT。它们都有dwExtraInfo,但在内存中的偏移量不同,因此由于使用了错误的结构类型,您正在打印出垃圾数据。

标签: c++ c windows winapi


【解决方案1】:

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

返回值

类型:LPARAM

返回值指定额外信息。的意义 额外信息因设备而异。

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

区分笔输入与鼠标和触摸

当您的应用程序收到鼠标消息时(例如 WM_LBUTTONDOWN),它可能会调用 GetMessageExtraInfo 函数来 评估消息是来自笔还是鼠标设备。

GetMessageExtraInfo 返回的值需要进行掩码检查 对 0xFFFFFF00,然后与 0xFF515700 进行比较。下列 定义可能会更清楚:

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

如果比较为真,则此鼠标消息是由 Tablet PC 笔或触摸屏。在所有其他情况下,您可以假设 此消息是由鼠标设备生成的。

GetMessageExtraInfo 返回的低 8 位是可变的。的 这些位 7(低 7 位,被 0x7F 屏蔽)用于表示 光标 ID,鼠标为零或笔 ID 的变量值。 此外,在 Windows Vista 中,被 0x80 掩码的第八位是 用于区分触摸输入和笔输入(0 = 笔,1 = 触摸)。

【讨论】:

    猜你喜欢
    • 2019-10-22
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    相关资源
    最近更新 更多