Функция WinBioEnrollCapture (winbio.h)

Записывает биометрический образец и добавляет его в шаблон. Начиная с Windows 10 сборки 1607, эта функция доступна для использования с мобильным образом.

Синтаксис

HRESULT WinBioEnrollCapture(
  [in]            WINBIO_SESSION_HANDLE SessionHandle,
  [out, optional] WINBIO_REJECT_DETAIL  *RejectDetail
);

Параметры

[in] SessionHandle

Значение WINBIO_SESSION_HANDLE, определяющее открытый биометрический сеанс. Откройте синхронный дескриптор сеанса, вызвав WinBioOpenSession. Откройте дескриптор асинхронного сеанса, вызвав WinBioAsyncOpenSession.

[out, optional] RejectDetail

Указатель на значение ULONG , содержащее дополнительные сведения о неудачном захвате биометрического образца. Если запись выполнена успешно, этот параметр имеет значение нулю. Для отслеживания отпечатков пальцев определены следующие значения:

  • WINBIO_FP_TOO_HIGH
  • WINBIO_FP_TOO_LOW
  • WINBIO_FP_TOO_LEFT
  • WINBIO_FP_TOO_RIGHT
  • WINBIO_FP_TOO_FAST
  • WINBIO_FP_TOO_SLOW
  • WINBIO_FP_POOR_QUALITY
  • WINBIO_FP_TOO_SKEWED
  • WINBIO_FP_TOO_SHORT
  • WINBIO_FP_MERGE_FAILURE

Возвращаемое значение

Если функция выполнена успешно, она возвращает S_OK. Если функция завершается ошибкой, она возвращает значение HRESULT , указывающее на ошибку. Возможные значения включают, но не ограничиваются ими в следующей таблице. Список распространенных кодов ошибок см. в разделе "Общие значения HRESULT".

Код возврата Description
E_ACCESSDENIED
Вызывающая учетная запись не разрешена для регистрации.
E_HANDLE
Недопустимый дескриптор сеанса.
E_POINTER
Указатель, указанный параметром RejectDetail , не может иметь значение NULL.
WINBIO_E_BAD_CAPTURE
Не удалось записать пример. Дополнительные сведения см. в значении RejectDetail .
WINBIO_E_LOCK_VIOLATION
Биометрическая единица используется и заблокирована.
WINBIO_I_MORE_DATA
Для создания надежного шаблона требуется один или несколько дополнительных примеров. Необходимо обновить инструкции пользователю, чтобы отправить дополнительные примеры и снова вызвать WinBioEnrollCapture .

Замечания

Любое приложение, которое регистрируется с помощью биометрических единиц в системном пуле, должно иметь фокус окна при вызове WinBioEnrollBegin. Если это не так, вызов блокируется до тех пор, пока приложение не получит фокус окна, и пользователь предоставил биометрический образец. Поэтому рекомендуется, чтобы приложение не вызывало WinBioEnrollBegin , пока оно не получило фокус. Способ получения фокуса зависит от типа написанного приложения. Например, при создании приложения графического интерфейса можно реализовать обработчик сообщений, который записывает WM_ACTIVATE, WM_SETFOCUS или другое соответствующее сообщение. Если вы пишете приложение CUI, вызовите GetConsoleWindow , чтобы получить дескриптор в окне консоли и передать этот дескриптор функции SetForegroundWindow , чтобы принудительно перевести окно консоли на передний план и назначить его фокус. Если приложение работает в отсоединяемом процессе и не имеет окна или не является службой Windows, используйте WinBioAcquireFocus и WinBioReleaseFocus для управления фокусом вручную.

Чтобы использовать WinBioEnrollCapture синхронно, вызовите функцию с дескриптором сеанса, созданным путем вызова WinBioOpenSession. Блоки функции блокируются до завершения операции или возникновения ошибки.

Чтобы использовать WinBioEnrollCapture асинхронно, вызовите функцию с дескриптором сеанса, созданным путем вызова WinBioAsyncOpenSession. Платформа выделяет WINBIO_ASYNC_RESULT структуру и использует ее для возврата сведений об успешном выполнении операции или сбое. Если операция не выполнена, платформа возвращает WINBIO_REJECT_DETAIL сведения в вложенной структуре EnrollCapture . Структура WINBIO_ASYNC_RESULT возвращается обратному вызову приложения или в очередь сообщений приложения в зависимости от значения, заданного в параметре NotificationMethod функции WinBioAsyncOpenSession :

  • Если вы решили получать уведомления о завершении с помощью обратного вызова, необходимо реализовать функцию PWINBIO_ASYNC_COMPLETION_CALLBACK и задать параметр NotificationMethodдля WINBIO_ASYNC_NOTIFY_CALLBACK.
  • Если вы решили получать уведомления о завершении с помощью очереди сообщений приложения, необходимо задать для параметра NotificationMethodзначение WINBIO_ASYNC_NOTIFY_MESSAGE. Платформа возвращает указатель WINBIO_ASYNC_RESULT на поле LPARAM сообщения окна.
Чтобы предотвратить утечку памяти, необходимо вызвать WinBioFree из реализации обратного вызова, чтобы освободить структуру WINBIO_ASYNC_RESULT после завершения использования.

Windows 7: Эту операцию можно выполнять асинхронно с помощью функции WinBioEnrollCaptureWithCallback . Функция проверяет входные аргументы и возвращает немедленно. Если входные аргументы недопустимы, функция возвращает код ошибки. В противном случае платформа запускает операцию в другом потоке. Когда асинхронная операция завершается или возникает ошибка, платформа отправляет результаты в функцию PWINBIO_ENROLL_CAPTURE_CALLBACK , реализованную приложением.

Примеры

Следующая функция регистрирует биометрический шаблон в системном пуле путем вызова WinBioEnrollCapture. Ссылка на статическую библиотеку Winbio.lib и включите следующие файлы заголовков:

  • Windows.h
  • Stdio.h
  • Conio.h
  • Winbio.h
HRESULT EnrollSysPool(
                      BOOL discardEnrollment, 
                      WINBIO_BIOMETRIC_SUBTYPE subFactor)
{
    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;

    // Connect to the system pool. 
    hr = WinBioOpenSession( 
            WINBIO_TYPE_FINGERPRINT,    // Service provider
            WINBIO_POOL_SYSTEM,         // Pool type
            WINBIO_FLAG_DEFAULT,        // Configuration and access
            NULL,                       // Array of biometric unit IDs
            0,                          // Count of biometric unit IDs
            NULL,                       // Database ID
            &sessionHandle              // [out] Session handle
            );
    if (FAILED(hr))
    {
        wprintf_s(L"\n WinBioOpenSession failed. ");
        wprintf_s(L"hr = 0x%x\n", hr);
        goto e_Exit;
    }

    // Locate a sensor.
    wprintf_s(L"\n Swipe your finger on the sensor...\n");
    hr = WinBioLocateSensor( sessionHandle, &unitId);
    if (FAILED(hr))
    {
        wprintf_s(L"\n WinBioLocateSensor failed. hr = 0x%x\n", hr);
        goto e_Exit;
    }

    // Begin the enrollment sequence. 
    wprintf_s(L"\n Starting enrollment sequence...\n");
    hr = WinBioEnrollBegin(
            sessionHandle,      // Handle to open biometric session
            subFactor,          // Finger to create template for
            unitId              // Biometric unit ID
            );
    if (FAILED(hr))
    {
        wprintf_s(L"\n WinBioEnrollBegin failed. hr = 0x%x\n", hr);
        goto e_Exit;
    }

    // Capture enrollment information by swiping the sensor with
    // the finger identified by the subFactor argument in the 
    // WinBioEnrollBegin function.
    for (int swipeCount = 1;; ++swipeCount)
    {
        wprintf_s(L"\n Swipe the sensor to capture %s sample.",
                 (swipeCount == 1)?L"the first":L"another");

        hr = WinBioEnrollCapture(
                sessionHandle,  // Handle to open biometric session
                &rejectDetail   // [out] Failure information
                );

        wprintf_s(L"\n Sample %d captured from unit number %d.", 
                  swipeCount, 
                  unitId);

        if (hr == WINBIO_I_MORE_DATA)
        {
            wprintf_s(L"\n    More data required.\n");
            continue;
        }
        if (FAILED(hr))
        {
            if (hr == WINBIO_E_BAD_CAPTURE)
            {
                wprintf_s(L"\n  Error: Bad capture; reason: %d", 
                          rejectDetail);
                continue;
            }
            else
            {
                wprintf_s(L"\n WinBioEnrollCapture failed. hr = 0x%x", hr);
                goto e_Exit;
            }
        }
        else
        {
            wprintf_s(L"\n    Template completed.\n");
            break;
        }
    }

    // Discard the enrollment if the appropriate flag is set.
    // Commit the enrollment if it is not discarded.
    if (discardEnrollment == TRUE)
    {
        wprintf_s(L"\n Discarding enrollment...\n\n");
        hr = WinBioEnrollDiscard( sessionHandle );
        if (FAILED(hr))
        {
            wprintf_s(L"\n WinBioLocateSensor failed. hr = 0x%x\n", hr);
        }
        goto e_Exit;    
    }
    else
    {
        wprintf_s(L"\n Committing enrollment...\n");
        hr = WinBioEnrollCommit( 
                sessionHandle,      // Handle to open biometric session
                &identity,          // WINBIO_IDENTITY object for the user
                &isNewTemplate);    // Is this a new template

        if (FAILED(hr))
        {
            wprintf_s(L"\n WinBioEnrollCommit failed. hr = 0x%x\n", hr);
            goto e_Exit;
        }
    }


e_Exit:
    if (sessionHandle != NULL)
    {
        WinBioCloseSession(sessionHandle);
        sessionHandle = NULL;
    }

    wprintf_s(L" Press any key to continue...");
    _getch();

    return hr;
}


Требования

Требование Ценность
Минимальный поддерживаемый клиент Windows 7 [только настольные приложения]
минимальный поддерживаемый сервер Windows Server 2008 R2 [только классические приложения]
целевая платформа Виндоус
Header winbio.h (include Winbio.h)
Library Winbio.lib
DLL Winbio.dll

См. также

WinBioAcquireFocus

WinBioEnrollBegin

WinBioEnrollCaptureWithCallback

WinBioEnrollCommit

WinBioEnrollDiscard

WinBioReleaseFocus