You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust winapi下如何将isize类型指针地址转换为MSLLHOOKSTRUCT结构体

Rust winapi 下 lParam 转 MSLLHOOKSTRUCT 实现方案

在winapi的低级别鼠标钩子回调中,将isize类型的lParam转换为MSLLHOOKSTRUCT结构体的操作完全基于裸指针类型转换,具体实现如下:

核心实现步骤

  1. 类型强转:将LPARAM(本质是isize)强转为*const MSLLHOOKSTRUCT类型的裸指针
  2. 解引用取值:在unsafe块内解引用裸指针,得到MSLLHOOKSTRUCT结构体实例

完整代码示例

首先导入所需依赖:

use winapi::{
    shared::minwindef::{LPARAM, WPARAM, LRESULT},
    um::winuser::{LowLevelMouseProc, HC_ACTION, MSLLHOOKSTRUCT, CallNextHookEx},
};

回调函数实现:

unsafe extern "system" fn low_level_mouse_proc(code: i32, wparam: WPARAM, lparam: LPARAM) -> LRESULT {
    // 仅当code为HC_ACTION时,lParam指向的结构体才有效
    if code == HC_ACTION {
        // 转换为对应类型的裸指针
        let mouse_struct_ptr = lparam as *const MSLLHOOKSTRUCT;
        // 解引用得到结构体实例,直接拷贝值使用
        let mouse_struct = *mouse_struct_ptr;
        
        // 可直接访问结构体所有字段,例如鼠标坐标、事件时间等
        println!("当前鼠标位置:X={}, Y={}", mouse_struct.pt.x, mouse_struct.pt.y);
        println!("鼠标事件时间戳:{}", mouse_struct.time);
    }
    // 必须调用下一个钩子,否则会影响系统其他钩子逻辑
    CallNextHookEx(std::ptr::null_mut(), code, wparam, lparam)
}

注意事项

  • 所有涉及裸指针解引用、FFI调用的逻辑都必须在unsafe块内执行,你需要自行保证操作的安全性
  • 不要将*const MSLLHOOKSTRUCT指针保存到回调外部使用,Windows仅保证回调执行过程中该内存区域有效,回调返回后访问会触发野指针未定义行为
  • 如果需要在回调外使用结构体数据,直接拷贝解引用后的MSLLHOOKSTRUCT实例即可,该结构体实现了Copy trait,所有字段会自动拷贝

内容的提问来源于stack exchange,提问作者tscpp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:45:07