【问题标题】:How do you use PostMessage with the windows-rs crate?您如何将 PostMessage 与 windows-rs 板条箱一起使用?
【发布时间】: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 _)

标签: windows rust hex postmessage


【解决方案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 不同),这意味着您的代码在继续执行之前不会等待消息处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
  • 1970-01-01
相关资源
最近更新 更多