一、背景
自己想做一个c#实现的指纹识别登录的功能,发现相关内容有点少,要没就是调用收费的sdk的。要么就是内容不全的。
二、调用SDK
C#有个zkFinger的指纹识别sdk提供,不过是收费的好像。Windows有专用的API接口,在winbio.h下,可以直接搜索到。不过是英文的,机翻怪难懂的。今天主要讲解下相关的一些接口以及参数的作用。
三、接口及参数
首先,相关接口信息在这边:winBioIdentify 函数 (winbio.h) - Win32 apps | Microsoft Learn 。官网也有将使用的代码放在函数下面,可以直接copy。讲一下指纹识别要用的几个接口函数。
首先是指纹传感器的,winBioEnumBiometricUnits这个接口
HRESULT WinBioEnumBiometricUnits(
[in] WINBIO_BIOMETRIC_TYPE Factor,
[out] WINBIO_UNIT_SCHEMA **UnitSchemaArray,
[out] SIZE_T *UnitCount
);
里面有三个参数,第一个参数Factor是传的生物识别类型,如面部或者指纹,不过文档说目前只支持指纹的,所以填WINBIO_TYPE_FINGERPRINT。然后会返回传感器的数组和数量。这个可以用来判断是否支持指纹识别。
这是相关的一些参数,下面有用到
HRESULT hr = S_OK;
WINBIO_IDENTITY identity = {0};
WINBIO_SESSION_HANDLE sessionHandle = NULL;
WINBIO_UNIT_ID unitId = 0;
WINBIO_REJECT_DETAIL rejectDetail = 0;
BOOLEAN isNewTemplate = TRUE;
然后就是注册功能相关的。首先。你需要用WinBioOpenSession打开一个生物识别的会话,这个会话在后续登录也同样要先打开,才能使用。
HRESULT WinBioOpenSession(
[in] WINBIO_BIOMETRIC_TYPE Factor,
[in] WINBIO_POOL_TYPE PoolType,
[in] WINBIO_SESSION_FLAGS Flags,
[in] WINBIO_UNIT_ID *UnitArray,
[in] SIZE_T UnitCount,
[in] GUID *DatabaseId,
[out] WINBIO_SESSION_HANDLE *SessionHandle
);
这个基本照官方的去创建就行,解释在代码里面
hr = WinBioOpenSession(
WINBIO_TYPE_FINGERPRINT, // 生物识别类型
WINBIO_POOL_SYSTEM, // 生物单元池
WINBIO_FLAG_DEFAULT, // Configuration and access
NULL, // Array of biometric unit IDs
0, // Count of biometric unit IDs
NULL, // 数据库id,NULL好像是Default
&sessionHandle // [out] 会话
);
创建完之后要定位传感器,通过WinBioLocateSensor去调用,调用后要你去触摸下指纹录入器触发。
hr = WinBioLocateSensor( sessionHandle, &unitId);
后面就是捕获指纹了。要通过两个函数WinBioEnrollBegin和WinBioEnrollCapture。第一个是告知系统开始执行录入,第二个是不断去捕获,多次捕获之后失败即丢弃,成功则成功。此时只是形成模板,还需要录入数据库。
hr = WinBioEnrollBegin(
sessionHandle, // 处理会话
subFactor, // 指纹类型
unitId // 生物单元id
);
if (FAILED(hr)) {}
// 开始捕捉
for (int swipeCount = 1;; ++swipeCount)
{
hr = WinBioEnrollCapture(
sessionHandle, // Handle to open biometric session
&rejectDetail // [out] Failure information
);
if (hr == WINBIO_I_MORE_DATA)
{
// 请继续按压
continue;
}
if (FAILED(hr))
{
if (hr == WINBIO_E_BAD_CAPTURE)
{
// 这次数据不太好,请继续按压
continue;
}
else
{
// 捕捉失败
break;
}
}
else
{
// 捕捉完成
break;
}
}
录入数据库的时候,你如果一开始是用的默认数据库,那么要注意了,他会和你windows系统的数据库关联,即你在该程序下录入的指纹,也可以解锁系统。具体我也不知道怎么解决。并且不能录入相同的指纹。录入的函数是WinBioEnrollCommit
hr = WinBioEnrollCommit(
sessionHandle, // Handle to open biometric session
&identity, // WINBIO_IDENTITY object for the user
&isNewTemplate); // Is this a new template
丢弃模板的函数是 WinBioEnrollDiscard
hr = WinBioEnrollDiscard( sessionHandle );
后续就是识别了,主要是用winbioIdentify。注意要先opensession
hr = WinBioIdentify(
sessionHandle, // Session handle
&unitId, // Biometric unit ID
&identity, // User SID
&subFactor, // Finger sub factor
&rejectDetail // Rejection information
);
初稿,写着玩。。
本文档介绍了如何在Windows环境中使用C++/C#实现指纹识别功能,包括调用Windows自带的API接口winbio.h,详细解析了winBioEnumBiometricUnits、WinBioOpenSession、WinBioLocateSensor、WinBioEnrollBegin、WinBioEnrollCapture等关键接口的用法,以及指纹录入和识别的过程。同时,提到了使用默认数据库可能遇到的问题,如指纹与系统解锁关联等。

被折叠的 条评论
为什么被折叠?



