gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:34:42 27 4
gpt4 key购买 nike

我正在尝试向应用程序发送 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,因为它要求窗口是事件窗口。我已经这样做了,而且效果很好,但是当我激活另一个窗口时 - 当然 - 它停止在前一个窗口上工作。

所以我想要实现的是,将输入发送到不需要处于事件状态的应用程序。

最佳答案

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

您可能想改用 Microsoft UI Automation

但是如果你想试验 WM_INPUT...

The LPARAM-parameter of the WM_INPUT-message contains a handle to a RAWINPUT-structure not an address or the structure itself... How to create such a handle?

这是一个非常古老的 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

关于c++ - 如何模拟原始输入/以正确的方式向应用程序发送 WM_INPUT 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12590145/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com