WinBioRegisterEventMonitor-Funktion (winbio.h)

Die WinBioRegisterEventMonitor-Funktion registriert eine Rückruffunktion, um Ereignisbenachrichtigungen vom Dienstanbieter zu empfangen, der einer geöffneten Sitzung zugeordnet ist.

Syntax

HRESULT WinBioRegisterEventMonitor(
  [in] WINBIO_SESSION_HANDLE  SessionHandle,
  [in] WINBIO_EVENT_TYPE      EventMask,
  [in] PWINBIO_EVENT_CALLBACK EventCallback,
  [in] PVOID                  EventCallbackContext
);

Parameter

[in] SessionHandle

Ein WINBIO_SESSION_HANDLE Wert, der die offene biometrische Sitzung identifiziert. Öffnen Sie das Sitzungshandle, indem Sie WinBioOpenSession aufrufen.

[in] EventMask

Ein Wert, der die Zu überwachenden Ereignistypen angibt. Derzeit wird nur der Fingerabdruckanbieter unterstützt. Sie müssen eines der folgenden Flags angeben.

  • WINBIO_EVENT_FP_UNCLAIMED

Der Sensor hat einen Finger wischen erkannt, der von der Anwendung nicht angefordert wurde, oder die anfordernde Anwendung hat keinen Fensterfokus. Das Windows Biometric Framework ruft Ihre Rückruffunktion auf, um anzugeben, dass ein Finger wischen stattgefunden hat, aber nicht versucht, den Fingerabdruck zu identifizieren.

  • WINBIO_EVENT_FP_UNCLAIMED_IDENTIFY

Der Sensor hat einen Finger wischen erkannt, der von der Anwendung nicht angefordert wurde, oder die anfordernde Anwendung hat keinen Fensterfokus. Das Windows Biometric Framework versucht, den Fingerabdruck zu identifizieren, und übergibt das Ergebnis dieses Prozesses an Ihre Rückruffunktion.

[in] EventCallback

Adresse einer Rückruffunktion, die die vom Windows Biometric Framework gesendeten Ereignisbenachrichtigungen empfängt. Sie müssen diese Funktion definieren.

[in] EventCallbackContext

Ein optionaler anwendungsdefinierter Wert, der im pvContext-Parameter der Rückruffunktion zurückgegeben wird. Dieser Wert kann alle Daten enthalten, für die die benutzerdefinierte Rückruffunktion konzipiert ist.

Rückgabewert

Wenn die Funktion erfolgreich ist, gibt sie S_OK zurück. Wenn die Funktion fehlschlägt, gibt sie einen HRESULT-Wert zurück, der den Fehler angibt. Mögliches Werte (aber nicht die Einzigen) sind die in der folgenden Tabelle. Eine Liste allgemeiner Fehlercodes finden Sie unter Allgemeine HRESULT-Werte.

Rückgabecode Beschreibung
E_HANDLE
Das Sitzungshandle ist ungültig.
E_POINTER
Die Adresse der Rückruffunktion, die durch den EventCallback-Parameter angegeben wird, darf nicht NULL sein.
E_INVALIDARG
Der EventMask-Parameter darf nicht 0 sein, und Sie können nicht gleichzeitig WINBIO_EVENT_FP_UNCLAIMED und WINBIO_EVENT_FP_UNCLAIMED_IDENTIFY angeben.
WINBIO_E_EVENT_MONITOR_ACTIVE
Ein aktiver Ereignismonitor wurde bereits registriert.
WINBIO_E_INVALID_OPERATION
Der Dienstanbieter unterstützt keine Ereignisbenachrichtigungen.

Hinweise

Diese Funktion ist nur für Sitzungen gültig, die mit einem Systemsensorpool verbunden sind.

Ereignisrückrufe werden seriell an die Clientanwendung übermittelt. Daher werden nachfolgende Ereignisbenachrichtigungen erst übermittelt, wenn der Client vom aktuellen Rückruf zurückkehrt. Ereignisse, die auftreten, während ein Rückruf noch ausgeführt wird, werden möglicherweise vom System verworfen. Um Den Verlust von Ereignissen zu vermeiden, sollten Sie keine zeitaufwendigen Arbeiten in Ihrer Rückrufroutine ausführen.

Die Clientanwendung sollte auf den Empfang von Ereignissen vorbereitet sein, sobald WinBioRegisterEventMonitor aufgerufen wird. Die Anwendung muss WinBioFree aufrufen, um die im Ereignisargument des Rückrufs zurückgegebene Struktur freizugeben. Wenn dies nicht geschieht, führt dies zu einem Speicherverlust im aufrufenden Prozess.

Nachdem ein Ereignismonitor gestartet wurde, kann die Sitzung, der der Monitor zugeordnet ist, andere Aufrufe der Windows Biometric Framework-API erst verarbeiten, wenn der Ereignismonitor beendet wurde. Wenn Ihre Anwendung andere API-Aufrufe ausführen muss, während sie weiterhin Ereignismonitorbenachrichtigungen empfängt, sollten Sie zwei Sitzungen öffnen – eine für den Ereignismonitor und eine andere für andere Vorgänge.

Rufen Sie WinBioUnregisterEventMonitor auf, um das Senden von Ereignisbenachrichtigungen an Ihre Rückruffunktion zu beenden.

Wenn eine Anwendung einen WinBio-Ereignismonitor registriert und diesen Monitor während eines Standby-/Aktivierungszyklus aktiv lässt, funktionieren Systeme, die die biometrische Pre-Boot-Authentifizierung (PBA)/Single Sign-On-Features implementieren, möglicherweise nicht immer. Das Problem besteht darin, dass der biometrische PBA-Aufruf vom Ereignismonitor abgefangen wird, bevor der Anbieter biometrischer Anmeldeinformationen des Systems die Möglichkeit hat, seinen ersten WinBioIdentify-Vorgang auszuführen. Apps, die das WinBio-Ereignisüberwachungsfeature verwenden, sollten die Registrierung ihrer Monitore aufheben, bevor das System in den Ruhezustand versetzt wird, und sie nach der Systemreaktivierung erneut registrieren. Weitere Informationen zum Behandeln von Ereignissen bei Änderungen des Energiezustands finden Sie unter Informationen zur Energieverwaltung.

Die Rückrufroutine muss die folgende Signatur aufweisen:


VOID CALLBACK EventCallback(
__in_opt PVOID EventCallbackContext,
__in HRESULT OperationStatus,
__in PWINBIO_EVENT Event
);

Beispiele

Die folgende Funktion registriert einen Ereignismonitor, indem die WinBioRegisterEventMonitor-Funktion aufgerufen und die Adresse einer Rückrufroutine übergeben wird. Der ebenfalls enthaltene Rückruf empfängt Ereignisbenachrichtigungen vom biometrischen Windows-Framework. Verknüpfen Sie die statische Bibliothek Winbio.lib, und fügen Sie die folgenden Headerdateien ein:

  • Windows.h
  • Stdio.h
  • Conio.h
  • Winbio.h
HRESULT RegisterSystemEventMonitor(BOOL bCancel)
{
    HRESULT hr = S_OK;
    WINBIO_SESSION_HANDLE sessionHandle = NULL;
    WINBIO_UNIT_ID unitId = 0;

    // 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. hr = 0x%x\n", hr);
        goto e_Exit;
    }

    // Call the WinBioRegisterEventMonitor function.
    wprintf_s(L"\n Calling WinBioRegisterEventMonitor.\n");
    hr = WinBioRegisterEventMonitor(
            sessionHandle,              // Open session handle
            WINBIO_EVENT_FP_UNCLAIMED,  // Events to monitor
            EventMonitorCallback,       // Callback function
            NULL                        // Optional context.
            );
    if (FAILED(hr))
    {
        wprintf_s(L"\n WinBioRegisterEventMonitor failed.");
        wprintf_s(L"hr = 0x%x\n", hr);
        goto e_Exit;
    }
    wprintf_s(L"\n Waiting for an event.\n");


    // Cancel the identification if the bCancel flag is set.
    if (bCancel)
    {
        wprintf_s(L"\n Starting CANCEL timer...\n");
        Sleep( 7000 );

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

    // Wait for an event to happen.
    //wprintf_s(L"\n Swipe the sensor to receive an event notice ");
    //wprintf_s(L"\n or press any key to stop waiting...\n");
    wprintf_s(L"\n Swipe the sensor one or more times ");
    wprintf_s(L"to generate events.");
    wprintf_s(L"\n When done, press a key to exit...\n");
    _getch();

    // Unregister the event monitor.
    wprintf_s(L"\n Calling WinBioUnregisterEventMonitor\n");
    hr = WinBioUnregisterEventMonitor( sessionHandle);
    if (FAILED(hr))
    {
        wprintf_s(L"\n WinBioUnregisterEventMonitor failed.");
        wprintf_s(L"hr = 0x%x\n", hr);
    }

e_Exit:

    if (sessionHandle != NULL)
    {
       wprintf_s(L"\n Closing the session.\n");

        hr = WinBioCloseSession(sessionHandle);
        if (FAILED(hr))
        {
            wprintf_s(L"\n WinBioCloseSession failed. hr = 0x%x\n", hr);
        }
        sessionHandle = NULL;
    }

    wprintf_s(L"\n Press any key to exit...");
    _getch();

    return hr;
}

//------------------------------------------------------------------------
// The following function is the callback for WinBioRegisterEventMonitor.
// The function filters any event notice from the biometric subsystem and 
// writes a result to the console window.
// 
VOID CALLBACK EventMonitorCallback(
    __in_opt PVOID EventCallbackContext,
    __in HRESULT OperationStatus,
    __in PWINBIO_EVENT Event
    )
{
    UNREFERENCED_PARAMETER(EventCallbackContext);

    wprintf_s(L"\n EventMonitorCallback executing.");

    // Failure.
    if (FAILED(OperationStatus))
    {
        wprintf_s(L"\n EventMonitorCallback failed. ");
        wprintf_s(L" OperationStatus = 0x%x\n", OperationStatus);
        goto e_Exit;
    }

    // An event notice was received.
    if (Event != NULL)
    {
        wprintf_s(L"\n MonitorEvent: ");
        switch (Event->Type)
        {
            case WINBIO_EVENT_FP_UNCLAIMED:
                wprintf_s(L"WINBIO_EVENT_FP_UNCLAIMED");
                wprintf_s(L"\n Unit ID: %d", 
                          Event->Parameters.Unclaimed.UnitId);
                wprintf_s(L"\n Reject detail: %d\n", 
                          Event->Parameters.Unclaimed.RejectDetail);
                break;

            case WINBIO_EVENT_FP_UNCLAIMED_IDENTIFY:
                wprintf_s(L"WINBIO_EVENT_FP_UNCLAIMED_IDENTIFY");
                wprintf_s(L"\n Unit ID: %d", 
                          Event->Parameters.UnclaimedIdentify.UnitId);
                wprintf_s(L"\n Reject detail: %d\n", 
                          Event->Parameters.UnclaimedIdentify.RejectDetail);
                break;

            case WINBIO_EVENT_ERROR:
                wprintf_s(L"WINBIO_EVENT_ERROR\n");
                break;

            default:
                wprintf_s(L"(0x%08x - Invalid type)\n", Event->Type);
                break;
        }
    }

e_Exit:

    if (Event != NULL)
    {
        //wprintf_s(L"\n Press any key to continue...\n");
        WinBioFree(Event);
        Event = NULL;
    }
}


Anforderungen

   
Unterstützte Mindestversion (Client) Windows 7 [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2008 R2 [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile winbio.h (einschließlich Winbio.h)
Bibliothek Winbio.lib
DLL Winbio.dll

Weitere Informationen

WinBioOpenSession

WinBioUnregisterEventMonitor