您如何将 PostMessage 与 windows-rs 板条箱一起使用?

Posted

技术标签:

【中文标题】您如何将 PostMessage 与 windows-rs 板条箱一起使用?【英文标题】:How do you use PostMessage with the windows-rs crate? 【发布时间】:2022-01-17 19:05:33 【问题描述】:

我是 rust 和 windows API 的新手,我正在尝试通过 windows-rs crate 使用 PostMessage 函数。但是,我不确定 WPARAM 期望什么数据类型。我试过猜测,因为 windows-rs 文档似乎没有说。 C++ 的官方 microsoft 文档似乎期望下面找到的常量.. 但是当我尝试将它们与 rust crate 一起使用时出现错误。

https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes

https://microsoft.github.io/windows-docs-rs/doc/windows/Win32/UI/WindowsAndMessaging/fn.PostMessageA.html

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-postmessagea

use windows::
    Win32::System::Threading::*, Win32::UI::WindowsAndMessaging::*, Win32::UI::Input::KeyboardAndMouse::*
;

fn main() 
    unsafe 
        Sleep(1000);
        let wh = GetActiveWindow();
        PostMessageA(wh, WM_KEYDOWN, VK_ADD, None);
    

我收到一条错误消息,告诉我 WPARAM 没有“VIRTUAL_KEY”的实现。我也尝试过以各种方式对 VK_ADD 使用十六进制。但每个人都会抛出关于 WPARAM 没有实现我尝试使用的类型的错误。

PostMessageA(wh, WM_KEYDOWN, 0x6B, None);
PostMessageA(wh, WM_KEYDOWN, "0x6B", None);
let hex: u32 = 0x6B;
PostMessageA(wh, WM_KEYDOWN, hex, None);

我也不确定如何发送正确格式的十六进制,所以我可能做错了。有没有人有任何想法,或者任何对 rust 有更好理解的人可以查看 crate 的源代码吗?

https://github.com/microsoft/windows-rs

【问题讨论】:

试试WPARAM (VK_ADD.0 as _) 【参考方案1】:

正如@Jmb 在他的评论中所说,使用WPARAM(VK_ADD.0 as _) 应该可以工作,但您还需要按照WM_KEYDOWN message 的要求传递LPARAM 参数,但如果您只是想发送键盘输入,那就更好了更容易使用SendInput

【讨论】:

感谢你们@Jmb 和 Ahmad。我现在可以按照建议使用 WPARAM 进行编译。 LPARAM 也类似吗? ``` 我已经阅读了有关 SendInput 的信息,但我不相信它能够将输入发送到不活动的窗口。 在您链接的文档中,它说 LPARAM 需要位?所以我猜这是一个按位运算符?我不确定如何通过它。我仍在努力解决这部分问题。 是的,LPARAM 是类似的,只是更难手动完成,因为您必须逐位填充所需的数据。 PostMessage 很有可能无法按预期工作(因为它不能完美地模拟按键),因此您可能需要根据您的用例最后使用 SendInput,在这种情况下,您需要更改前台窗口暂时转到所需的输入窗口,然后使用 SendInput。 要填充 LPARAM,您需要以下内容:let l_param = repeat_count | (scan_code << 16) | (extended << 24) | (context_code << 29) | (previous_state << 30) | (transition_state << 31) 请注意,我还没有对此进行测试,所以要小心。请记住稍后发送WM_KEYUP 消息,并记住PostMessage 是异步的(与SendMessage 不同),这意味着您的代码在继续执行之前不会等待消息处理。

以上是关于您如何将 PostMessage 与 windows-rs 板条箱一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

window.postMessage VS window.chrome.webview.postMessage

文件系统访问 API:如何使用 postMessage 发送文件句柄?

消息与函数,postmessage与sendmessage,该怎么解决

在window.open()窗口中使用postMessage()方法传递数据。ie可以正常接收和处理。火狐与谷歌不行。代码如下

利用 postMessage 进行数据传递

js--window.postMessage