如何模拟原始输入/以正确的方式向应用程序发送WM_INPUT消息
How to simulate raw input / Send a WM_INPUT message to an application the right way?
我正在尝试向应用程序发送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
我卡在至少两个位置:
是否需要传递一些特殊的东西给
raw.data.keyboard.ExtraInformation
,还是GetMessageExtraInfo()
,或者没有必要在这里传递任何东西?WM_INPUT消息的 LPARAM 参数包含 RAWINPUT 结构的句柄,而不是地址或结构本身...如何创建这样的句柄?
我不想使用 SendInput,因为它要求窗口是活动窗口。我已经这样做了,并且工作正常,但是当我激活另一个窗口时 - 当然 - 它在前一个窗口上停止工作。
因此,我试图实现的是,将输入发送到不需要是活动应用程序的应用程序。
所有原始输入文档都针对如何处理系统发送到应用程序的原始消息。 几乎没有迹象表明,如果您的应用程序将此类消息发送到另一个应用程序,它将正常工作。 接收应用程序必须注册才能接收WM_INPUT
消息,而大多数应用程序不会。
你可能希望改用 UI 自动化Microsoft。
但是如果你想尝试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
相关文章:
- 适用于 macOS 的 Xcode 应用程序。这就是我设置从USB麦克风输入获取音频的方式。一年前工作,现在没有了。为什么
- OpenGL应用程序在不同的计算机上的工作方式不同
- 如何将Qt嵌入到另一个应用程序中(非阻塞方式)
- 无论如何,是否可以确定MFC应用程序是通过PC重新启动或用户单击应用程序快捷方式开始的
- 在计算机级别,应用程序以二进制方式运行,然后当发生运行时错误时,它如何呈现回错误代码
- 如何以编程方式获取应用程序的内存使用情况
- 如何为 QT Windows 应用程序设置不同的桌面快捷方式图标和任务栏图标不同
- 跨平台方式,以防止打开应用程序的多个实例
- 在Linux中寻找正确的方式,将C 应用程序从C 应用程序编写加密文本到加密的GPG文件
- 如何以编程方式设置应用程序EXE文件的图标
- 无法通过编程方式确定我的应用程序使用的TLS版本
- 仅使用标题栏中的[X]按钮关闭MFC应用程序并禁用ESC快捷方式
- 以可维护的方式管理应用程序配置的模式
- 使用C++在Windows 8中不固定到"开始屏幕"的应用程序快捷方式
- 此应用程序已请求运行时以异常方式终止它 QT C++
- 如何以编程方式为应用程序创建文件夹,以使用 BOX REST API 在其中上传内容
- .NET:如何以编程方式确定是否已编译 .NET 应用程序
- 如何模拟原始输入/以正确的方式向应用程序发送WM_INPUT消息
- 如何在WinRT C++Direct3D应用程序中以程序方式创建TextBox
- Visual Studio静态链接的应用程序方式太小