如何将*mut c_void安全转换为HWND?类型不匹配问题求助
如何将*mut c_void安全转换为HWND(Rust windows crate)
你遇到的类型不匹配问题,是因为windows crate中的HWND是封装后的结构体,并非直接等价于原始指针类型,因此无法直接赋值转换。
正确转换方式
由于HWND内部基于isize实现,且提供了from_raw方法用于从原始句柄转换,你需要在unsafe块中完成转换(因为编译器无法验证原始指针的有效性,需要你自行保证指针是合法未释放的HWND):
use windows::Win32::Foundation::HWND; let hwnd_ptr = match parent.handle { RawWindowHandle::Win32(_handle) => _handle.hwnd, _ => panic!("仅支持Win32窗口句柄"), }; // 安全转换:需确保hwnd_ptr是有效的HWND let test: HWND = unsafe { HWND::from_raw(hwnd_ptr as _) };
替代写法
你也可以直接通过HWND的结构体构造器完成转换,本质和from_raw一致:
let test = HWND(hwnd_ptr as isize);
注意事项
- 转换必须放在
unsafe块中(直接构造时虽然语法上不需要,但逻辑上仍然是不安全操作),因为你需要确保传入的*mut c_void确实是一个有效的、属于当前进程且未被销毁的HWND,否则会导致未定义行为。
内容的提问来源于stack exchange,提问作者AZ Developers
相关产品推荐
相关产品推荐

