- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试弄清楚如何在 Rust 中设置全局 Windows Hook 。我可以找到其他语言的多个示例,但 Rust 似乎没有任何示例。
到目前为止我设法得到了什么:
extern crate user32;
extern crate winapi;
const WH_KEYBOARD_LL: i32 = 13;
fn main() {
let hook_id = user32::SetWindowsHookExA(
WH_KEYBOARD_LL,
Some(hook_callback),
// No idea what goes here ,
0,
);
}
fn hook_callback(code: i32, wParam: u64, lParam: i64) -> i64 {
// ...
}
编译器提示它需要一个“系统”fn
作为回调函数,但得到的是一个 Rust fn
,这是有道理的,但我还是不明白知道如何让它发挥作用。
根据我从文档中收集到的信息,第三个参数 hMod
应该指向具有回调函数的同一模块,而其他语言的示例使用一些获取当前模块句柄的函数,但我不知道如何在 Rust 中做到这一点。
最佳答案
The compiler complains that it needs a "system"
fn
for the callback function, but is getting a Rustfn
, which makes sense, but I still don't know how to make that work.
编译器实际上完全给了你你需要的东西……如果你继续阅读你会看到的错误:
expected type `unsafe extern "system" fn(i32, u64, i64) -> i64`
found type `fn(i32, u64, i64) -> i64 {hook_callback}`
加上它,得到:
extern "system" fn hook_callback(code: i32, wParam: u64, lParam: i64) -> i64 {
0
}
From what I gathered from the documentation, the third parameter
hMod
should point to the same module that has the callback function, and the examples in other languages uses some function that gets the current module handle, but I don't know how to do that in Rust.
再次,进一步阅读 WinAPI 文档表明,如果线程 ID(最后一个参数)指定它在同一进程中,则 NULL
应该是此参数的值。由于您已经传递了零 - 文档指出它与当前进程中的所有线程相关联......这就是它应该是的......NULL
。所以现在我们得到:
let hook_id =
user32::SetWindowsHookExA(WH_KEYBOARD_LL, Some(hook_callback), std::ptr::null_mut(), 0);
这编译。
考虑到您将得到的关于 unsafe
的其他错误...这给了您(完整的工作代码):
extern crate user32;
extern crate winapi;
const WH_KEYBOARD_LL: i32 = 13;
fn main() {
unsafe {
let hook_id =
user32::SetWindowsHookExA(WH_KEYBOARD_LL, Some(hook_callback), std::ptr::null_mut(), 0);
// Don't forget to release the hook eventually
user32::UnhookWindowsHookEx(hook_id);
}
}
extern "system" fn hook_callback(code: i32, wParam: u64, lParam: i64) -> i64 {
0
}
关于windows - 如何在 Rust 中使用 SetWindowsHookEx?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51033906/
我想捕获用户键盘输入以对键盘媒体键做出良好 react :播放/暂停,尤其是下一个和上一个。我尝试将 SetWindowsHookEx 与低级 WH_KEYBOARD_LL 参数一起使用,以确保我可以
我正在使用 SetWindowsHookEx 将 dll 注入(inject)另一个进程。但是,当注入(inject)程序退出时,dll 会从其他进程中卸载。无论如何我可以停止卸载吗?基本上,无论注入
我正在尝试向类中添加低级鼠标 Hook 。我可以通过将这个函数放在我的 CPP 文件中来做到这一点: LRESULT CALLBACK MouseHookProc(int nCode, WPARAM
我不太了解SetWindowsHookEx() 的文档。我知道要在第一个参数中放入什么,但对于第二个、第三个和第四个我感到困惑。 第二个参数询问 HOOKPROC 是不是就像一个普通的 windows
我想在创建窗口之前使用 SetWindowHookEx 在进程中捕获 WM_CREATE(或 HCBT_CREATEWND)消息。 使用 hMod 和 dwThreadId 可以定义 Hook 是否在
好吧,我尝试了不同的解决方案来解决我的问题,但它就是行不通。 我调用了 SetWindowsHookExA,然后当我按下一个键时,消息框没有显示。怎么办? 这是我的代码(这是一个由程序加载的另一个 D
动态链接库代码: LRESULT CALLBACK CBTNewProc(int nCode, WPARAM wParam, LPARAM lParam) { std::ofstream fi
我的键盘记录器有问题。直到今天,每个经过测试的系统都运行良好,除了 Windows 7 Embedded Standard 32 位,它显然与当前版本不符。 我需要做的是记录从键盘输入的按键,直到我得
我在 WM_MOUSE 上定义了一个全局钩子(Hook),它可以完美运行一段时间。每次鼠标移动时,它都会向特定窗口发送一条消息。 在某个随机时间后, Hook 停止发送消息。如果我注销并注册 Hook
首先:我在 Windows XP - 32 位上使用 Visual Studio 2010。 现在我正在尝试编写一个 DLL,它将使另一个应用程序能够使用低级键盘 Hook 。 即使我让它工作了 -
我正在尝试升级旧应用程序以在 Windows 7 上运行,但我在使用 Journal Hooks 的“宏录制”功能时遇到问题。我已遵循在 Windows 7 上执行此操作所需的所有步骤,即设置 uiA
我正在Delphi中编写笑话程序(当用户使用鼠标或键盘时发出奇怪的声音),它使用全局钩子(Hook)来捕获鼠标和键盘事件。 这是负责处理这个钩子(Hook)的函数: procedure MKHOOK(
我正在使用以下代码获取当前进程的鼠标消息。 using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule
HHOOK WINAPI SetWindowsHookEx( __in int idHook, __in HOOKPROC lpfn, __in HINSTANCE hMod, __in
我正在尝试修改一款旧游戏,更具体地说,我想通过 Xbox Controller 输入来模拟键盘输入。我已经让游戏 handle 输入正常工作,但游戏忽略了我用 PostMessage 创建的假输入(我
您好,在此先感谢所有愿意提供帮助的人。我正在尝试设置一个 CBT windows Hook ,当我在全局设置它时效果很好,但每当我尝试将它附加到单个线程时都会失败。据我所知,我按照这本书做每件事:-
我在 C# 中创建了简单的控制台,它使用 SetWindowsHookEx 和 LowLevelKeyboardProc 来捕获键盘事件并将它们记录在 Windows 上。 这很有效,但是我知道我想创
我有这段代码,它为低级事件设置键盘钩子(Hook),然后显示一个消息框。 HHOOK keyboardHook = SetWindowsHookEx (WH_KEYBOARD_LL, HookKey,
我有一个带有嵌入式 v8 引擎的小型控制台应用程序,我想添加一个 Hook 来注册按键事件。这一切在我使用 Qt 和 QtScript 之前都有效,但我将它全部移植到 VC++ 2008 中的直接 C
我正在创建一个控制台应用程序,我想在其中记录按键操作(例如向上箭头)。我创建了一个低级键盘 Hook ,它应该捕获任何线程中的所有按键并调用我的回调函数,但它不起作用。当我按下一个键时,程序会暂停一点
我是一名优秀的程序员,十分优秀!