Rust 人脸识别实战:用 windows-rs 三步跑通 Windows Hello 生物识别认证
【免费下载链接】windows-rsRust for Windows项目地址: https://gitcode.com/GitHub_Trending/wi/windows-rs
密码输了又忘、忘了又输,不如看一眼摄像头。本文用 windows-rs 库调用 Windows 的 WinBio 生物识别 API,带你用不到 60 行 Rust 代码实现一个可运行的 Windows Hello 人脸识别认证流程。
一图看懂 🔍
WinBio 是 Windows 内置的生物识别接口:你的程序先"开一个会话",再让系统传感器采集人脸、和本地存储的人脸模板比对,最后告诉你通过了没。人脸数据全程只存在设备本地,程序拿到的只是一个"通过/失败"的结果,非常适合给应用加一道免密验证。
快速上手 ⚡
- 环境要求:Windows 10/11,且该账号已在 Windows Hello 中录好人脸
- 安装 Rust 后,创建项目并引入依赖:
cargo new hello_face && cd hello_face cargo add windows --features Win32_Devices_WinBio- 所有 WinBio 函数都在
windows::Win32::winbio模块里,源码可在 crates/libs/windows/src/Windows/Win32/winbio/ 查看
核心流程:从开会话到关会话
整个流程就三个函数,像借还图书一样:借书(开会话)→ 查书(识别)→ 还书(关会话)。
第 1 步:WinBioOpenSession,拿一张"临时通行证"
返回值是会话句柄,相当于一张临时通行证,后续所有操作都要出示它。
| 参数 | 说明 |
|---|---|
| factor | 生物识别类型,人脸识别传WINBIO_TYPE_FACIAL_FEATURES |
| pooltype | 生物识别池,一般传WINBIO_POOL_SYSTEM |
| flags | 会话选项,0即默认 |
| unitarray | 指定传感器,传None用系统默认 |
| databaseid | 指定生物库,传None用系统默认 |
第 2 步:WinBioIdentify,把比对交给系统
该调用是阻塞式的,会挂起直到识别成功、失败或用户取消;如果程序有 UI,可改用同模块的WinBioIdentifyWithCallback异步版本。
| 参数 | 说明 |
|---|---|
| sessionhandle | 上一步拿到的会话句柄 |
| unitid | 可选,回填实际参与识别的传感器 ID |
| identity | 可选,回填匹配到的用户身份信息 |
| subfactor | 可选,子类型,人脸识别时为 0 |
| rejectdetail | 可选,失败原因码,成功时为 0 |
第 3 步:WinBioCloseSession,归还通行证
一个参数,就是会话句柄。用完就关,避免占用生物识别资源。
完整可运行示例 🛠️
use windows::core::HRESULT; use windows::Win32::winbio::{ WinBioCloseSession, WinBioIdentify, WinBioOpenSession, WINBIO_IDENTITY, WINBIO_POOL_SYSTEM, WINBIO_SESSION_FLAGS, WINBIO_TYPE_FACIAL_FEATURES, }; fn main() -> Result<(), HRESULT> { // 1. 开会话:拿到一张"临时通行证" let session = unsafe { WinBioOpenSession( WINBIO_TYPE_FACIAL_FEATURES, // 生物识别类型:人脸 WINBIO_POOL_SYSTEM, // 系统生物识别池 WINBIO_SESSION_FLAGS(0), // 默认选项 None, // 用系统默认传感器 None, // 用系统默认生物库 ) }?; // 2. 触发识别:阻塞直到出结果 let mut identity = WINBIO_IDENTITY::default(); let hr = unsafe { WinBioIdentify( session, None, // 不关心是哪个传感器 Some(&mut identity), None, None, ) }; hr?; // 失败会在这里返回 HRESULT println!("识别通过,身份类型:{:?}", identity.Type); // 3. 关会话:归还通行证 unsafe { WinBioCloseSession(session) }?; Ok(()) }排错指南 ⚠️
| 错误码 / 现象 | 常见原因 | 解决办法 |
|---|---|---|
WINBIO_E_NO_MATCH(0x80098005) | 人脸与模板未匹配 | 检查光线、正对摄像头,提示用户重试 |
WINBIO_E_CANCELED(0x80098004) | 用户中途取消识别 | 属正常流程,允许重新发起 |
E_ACCESSDENIED | 无权限或生物识别服务未就绪 | 确认 Windows Hello 已录入人脸、以普通交互会话运行 |
E_UNEXPECTED/ 其他 HRESULT | 句柄已关闭或参数非法 | 检查是否在WinBioCloseSession之后继续使用了会话 |
拿到 HRESULT 后可直接println!("{:?}", hr)输出排查,更多 API 细节见 windows crate 文档,调用示例可参考 crates/samples/windows/。
【免费下载链接】windows-rsRust for Windows项目地址: https://gitcode.com/GitHub_Trending/wi/windows-rs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考