概要
Windowsのサービス等、画面UIを持たないプログラム上で指紋認証を行う場合は、"WinBioAcquireFocus"関数を使用してフォーカスを取得する必要があります。
サンプルコード
-
Windowsのサービスを作成します。ここでは下記の記事で作成したプロジェクトを使用します。
[ATLを使用してWindowsのサービスを作成する]
https://qiita.com/Leeya/items/1f8f8db7e8cb7dbbbcf2 -
WBFが使用できるように、必要なファイルをインクルード及びリンクします。
# include <Winbio.h>
# pragma comment(lib, "Winbio.lib")
- サービスのメイン処理に下記のコードを実装します。
// メイン処理
void RunMessageLoop() throw()
{
# if 1 // 追加 ここから
// WBFサンプルコード
WBFSampleCode();
# endif // 追加 ここまで
MSG msg;
while (GetMessage(&msg, 0, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
# if 1 // 追加 ここから
// WBFサンプルコード
HRESULT WBFSampleCode()
{
HRESULT hr = S_OK, hrFocus = S_OK;
WINBIO_SESSION_HANDLE sessionHandle = NULL;
try
{
// システムプールに接続する
hr = WinBioOpenSession(WINBIO_TYPE_FINGERPRINT, WINBIO_POOL_SYSTEM, WINBIO_FLAG_DEFAULT, NULL, 0, NULL, &sessionHandle);
if (FAILED(hr))
throw hr;
// フォーカスの取得
hrFocus = WinBioAcquireFocus();
if (FAILED(hrFocus))
throw hrFocus;
// 指紋認証
WINBIO_UNIT_ID unitId = 0;
WINBIO_IDENTITY identity = { 0 };
WINBIO_BIOMETRIC_SUBTYPE subFactor = 0;
WINBIO_REJECT_DETAIL rejectDetail = 0;
hr = WinBioIdentify(sessionHandle, &unitId, &identity, &subFactor, &rejectDetail);
if (FAILED(hr))
throw hr;
}
catch (HRESULT hrError) { hr = hrError; }
catch (...) { hr = E_UNEXPECTED; }
if (SUCCEEDED(hrFocus))
WinBioReleaseFocus();
if (sessionHandle != NULL)
WinBioCloseSession(sessionHandle);
// イベントログに結果を出力する
wchar_t pwcLog[_MAX_PATH + 1] = { 0 };
_snwprintf_s(pwcLog, _MAX_PATH, L"指紋認証結果 [0x%08X]", hr);
OutputEventLog(pwcLog);
return hr;
}
// イベントログ
HRESULT OutputEventLog(wchar_t *pwcLog)
{
HRESULT hr = S_OK;
HANDLE hEventSource = NULL;
try
{
// イベントログのオープン
hEventSource = RegisterEventSource(NULL, L"ATLServiceSample");
// イベントログに出力
const wchar_t* pwcMsg = &pwcLog[0];
ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, &pwcMsg, NULL);
}
catch (HRESULT hrError) { hr = hrError; }
catch (...) { hr = E_UNEXPECTED; }
if(hEventSource != NULL)
DeregisterEventSource(hEventSource);
return hr;
}
# endif // 追加 ここまで
実行
-
このサンプルコードを実行する前に、Windowsの[設定]→[アカウント]→[サインインオプション]→[指紋認識(Windows Hello)]で指紋を登録してください。
-
ビルドしたEXEを下記コマンドでサービスとして登録します。
"D:\Work\ATLServiceSample\x64\Release\ATLServiceSample.exe" /Service
※ 実行ファイルのパスはそれぞれの環境のものを使用してください。 -
スタートメニューから[Windowsツール]→[サービス]を開き、[ATLServiceSample]を開始すると指紋センサーが認証の待機状態になるので、指紋センサーをスワイプorタッチしてください。
-
指紋認証が完了すると、イベントログに結果が出力されます。
結果が[0x00000000]なら認証成功、[0x80098003]なら未登録の指紋です。