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

C++ 如何以正确的方式模拟原始输入/向应用程序发送WM_输入消息?,c++,windows,visual-c++,keyboard-events,raw-input,C++,Windows,Visual C++,Keyboard Events,Raw Input,我试图向应用程序发送WM_输入消息,但遇到了一些我无法解决的障碍。 我创建了如下所示的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 &

我试图向应用程序发送WM_输入消息,但遇到了一些我无法解决的障碍。 我创建了如下所示的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
//尝试发送“W”
RAWINPUT raw={0};
字符c='W';
//标题
raw.header.dwSize=sizeof(原始);
raw.header.dwType=RIM\u type键盘;
raw.header.wParam=0//(wParam&0xff=0=>0)
raw.header.hDevice=hDevice;
//资料
raw.data.keyboard.Reserved=0;
raw.data.keyboard.Flags=RI\u KEY\u MAKE//按下键
raw.data.keyboard.MakeCode=static_cast(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;/???
//发送消息
SendMessage(hPSWnd,WM_输入,0,(LPRAM)原始/*原始输入句柄*/)//TODO:原始输入的句柄
我被卡在至少两个位置:

  • 是否需要向
    raw.data.keyboard.ExtraInformation
    传递特殊信息,或者是
    GetMessageExtraInfo()
    ,或者不需要在此处传递任何信息

  • WM_INPUT-message的LPARAM参数包含RAWINPUT结构的句柄,而不是地址或结构本身。。。如何创建这样的句柄

  • 我不想使用SendInput,因为它要求窗口为活动窗口。 我已经这样做了,它工作得很好,但是当我激活另一个窗口时——当然——它停止了前一个窗口的工作

    因此,我试图实现的是,将输入发送到不需要是活动应用程序的应用程序。

    所有这些都是为了处理系统发送到应用程序的原始消息。如果您的应用程序向另一个应用程序发送这样的消息,几乎没有迹象表明它会正常工作。接收应用程序必须,而大多数应用程序不需要

    您可能希望使用

    但是如果你想用
    WM\u输入进行实验

    WM_INPUT-message的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
    
    HGLOBAL hRaw=::GlobalAlloc(GHND,sizeof(RAWINPUT));
    RAWINPUT*pRaw=重新解释铸件(::GlobalLock(hRaw));
    //使用pRaw初始化结构
    ::GlobalUnlock(hRaw);
    //使用hRaw作为LPRAM
    
    您确定不想使用
    SendInput
    功能吗?