如何模拟原始输入/以正确的方式向应用程序发送WM_INPUT消息?

时间:2012-09-25 19:55:41

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

我正在尝试向应用程序发送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结构的句柄而不是地址或结构本身......如何创建这样的句柄?

  3. 我不想使用SendInput,因为它要求窗口是活动窗口。 我已经这样做了,它工作正常,但当我激活另一个窗口 - 当然 - 它停止了前一个工作。

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

1 个答案:

答案 0 :(得分:2)

所有raw input documentation都面向如何处理系统发送给您的应用程序的原始消息。如果您的应用程序将此类消息发送到另一个应用程序,则很少有迹象表明它将正常工作接收应用程序必须register to receive WM_INPUT messages,而大多数应用程序不必。{/ p>

您可能希望改为使用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