【问题标题】:How to simulate raw input / Send a WM_INPUT message to an application the right way?如何以正确的方式模拟原始输入/向应用程序发送 WM_INPUT 消息?
【发布时间】:2013-11-30 15:48:14
【问题描述】:

我正在尝试向应用程序发送 WM_INPUT 消息,但遇到了一些我无法解决的障碍。 我创建了如下所示的 RAWINPUT 结构:

//try sending 'W'
    RAWINPUT raw = {0};
    char c = 'W';
    //header
    raw.header.dwSize = sizeof(raw);
    raw.header.dwType = RIM_TYPEKEYBOARD;
    raw.header.wParam = 0; //(wParam & 0xff =0 => 0)
    raw.header.hDevice = hDevice;

    //data
    raw.data.keyboard.Reserved = 0;
    raw.data.keyboard.Flags = RI_KEY_MAKE;      //Key down
    raw.data.keyboard.MakeCode = static_cast<WORD>(MapVirtualKeyEx(c, MAPVK_VK_TO_VSC, GetKeyboardLayout(0)));
    raw.data.keyboard.Message = WM_KEYDOWN;
    raw.data.keyboard.VKey = VkKeyScanEx(c, GetKeyboardLayout(0));
    raw.data.keyboard.ExtraInformation = 0;         //???

    //Send the message
    SendMessage(hPSWnd, WM_INPUT, 0, (LPARAM)raw/*Raw input handle*/);      //TODO: Handle to raw input

我卡在至少两个位置:

  1. 是否需要传递一些特殊的东西给raw.data.keyboard.ExtraInformation,或者是GetMessageExtraInfo(),或者这里不需要传递任何东西?

  2. WM_INPUT 消息的 LPARAM 参数包含指向 RAWINPUT 结构的句柄,而不是地址或结构本身...如何创建这样的句柄?

我不想使用 SendInput,因为它要求窗口是活动窗口。 我已经这样做了,而且效果很好,但是当我激活另一个窗口时 - 当然 - 它停止在前一个窗口上工作。

所以我想要实现的是,将输入发送到不需要成为活动应用程序的应用程序。

【问题讨论】:

  • 您确定不想使用SendInput 函数吗?

标签: c++ windows visual-c++ keyboard-events raw-input


【解决方案1】:

所有raw input documentation 都针对如何处理系统发送到您的应用程序的原始消息。如果您的应用程序将此类消息发送到另一个应用程序,几乎没有迹象表明它会正常工作。接收应用必须register to receive WM_INPUT messages,大多数应用不需要。

您可能想改用Microsoft UI Automation

但如果你想尝试WM_INPUT...

WM_INPUT 消息的 LPARAM 参数包含指向 RAWINPUT 结构的句柄,而不是地址或结构本身...如何创建这样的句柄?

这是一个非常古老的 API,它要求您使用其中一个基于句柄的内存管理器中的句柄。

HGLOBAL hRaw = ::GlobalAlloc(GHND, sizeof(RAWINPUT));
RAWINPUT *pRaw = reinterpret_cast<RAWINPUT*>(::GlobalLock(hRaw));
// initialize the structure using pRaw
::GlobalUnlock(hRaw);
// use hRaw as the LPARAM

【讨论】:

    猜你喜欢
    • 2013-06-11
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 2015-06-04
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多