Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 异步WinBioVerify与WinBioVerifyWithCallback_C++_Windows_Windows 7_Biometrics - Fatal编程技术网

C++ 异步WinBioVerify与WinBioVerifyWithCallback

C++ 异步WinBioVerify与WinBioVerifyWithCallback,c++,windows,windows-7,biometrics,C++,Windows,Windows 7,Biometrics,我编写了一个在Windows 8.1和10中运行的程序,使用WinBioVerify根据当前登录用户的身份验证指纹。我通过使用WinSyncOpenSession启动会话来异步执行此操作。我尝试在Windows 7上运行相同的程序,结果发现WinBio.dll的Win7版本中不存在WinBioAsyncOpenSession 这本不应该是一个问题,因为为Win7创建一个单独的EXE非常容易,它可以正常打开会话并调用WinBioVerifyWithCallback。我现在遇到的问题与原始程序没有正

我编写了一个在Windows 8.1和10中运行的程序,使用WinBioVerify根据当前登录用户的身份验证指纹。我通过使用WinSyncOpenSession启动会话来异步执行此操作。我尝试在Windows 7上运行相同的程序,结果发现WinBio.dll的Win7版本中不存在WinBioAsyncOpenSession

这本不应该是一个问题,因为为Win7创建一个单独的EXE非常容易,它可以正常打开会话并调用WinBioVerifyWithCallback。我现在遇到的问题与原始程序没有正确设置应用程序的窗口焦点时的症状相同:触摸指纹单元时会亮起,但没有结果返回到代码

Google搜索发现一些引用SetForegroundWindow()在Win7中不可靠,但我尝试过的其他方法(BringWindowToTop、AttachThreadInput、WinBioAcquireFocus)都没有成功,假设焦点是问题所在

是否有人拥有或知道Windows 7上WinBioVerifyWithCallback的任何工作示例

编辑以添加:

以下是在Win8.1/Win10上运行的代码:

}

以下代码在Win7上不起作用:

unsigned int verifyUser7(string &userName) {

string libPath;

OutputDebugString("verifyUser7: getApplicationPath");

libPath = getApplicationPath();
//  HWND capwnd;


try {

    //Make sure path ends with backslash
    if (libPath[libPath.length() - 1] != '\\') libPath += "\\";
    string  userHash = getHash(userName);

    //Get timeout from globals
    int timeoutValue = globals.timeout * 1000;

    //Check to see if we need an infinite timeout
    if (globals.disable_timeout)
    {
        timeoutValue = 1000 * 60 * 5;
    }
    TotalTickCount = timeoutValue; //5 minutes
    startTick = GetTickCount();
    globals.last_scan_result = BIO_INPROGRESS;
    countdownTimer = SetTimer(hMainWnd, ID_COUNTDOWN, 1000, NULL);

    CString lsr;
    lsr.Format("globals.last_scan_result = %d", globals.last_scan_result);
    OutputDebugString(lsr);

    sessionHandle = NULL;
    HRESULT 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))
    {
        CString s;
        s.Format("WinBioOpenSession failed. hr = 0x%x\n", hr);
        OutputDebugString(s);
        KillTimer(hMainWnd, countdownTimer);
        ShowWindow(hMainWnd, SW_HIDE);
        LockSetForegroundWindow(LSFW_UNLOCK);
        if (sessionHandle != NULL)
        {
            WinBioCloseSession(sessionHandle);
            sessionHandle = NULL;
        }
        return BIO_ERROR;
    }

    // Find the identity of the user.
    WINBIO_IDENTITY identity = { 0 };
    hr = GetCurrentUserIdentity(&identity);
    if (FAILED(hr))
    {
        CString s;
        s.Format("User identity not found. hr = 0x%x\n", hr);
        OutputDebugString(s);
        KillTimer(hMainWnd, countdownTimer);
        ShowWindow(hMainWnd, SW_HIDE);
        LockSetForegroundWindow(LSFW_UNLOCK);
        if (sessionHandle != NULL)
        {
            WinBioCloseSession(sessionHandle);
            sessionHandle = NULL;
        }
        return BIO_USER_NOT_ENROLLED;
    }

    // Verify a biometric sample.
    WINBIO_UNIT_ID unitId = 0;
    WINBIO_REJECT_DETAIL rejectDetail = 0;
    BOOLEAN match = FALSE;
    OutputDebugString("Calling WinBioVerifyWithCallback");
    SetWindowText(hStaticWnd, "To sign in, scan your finger on the fingerprint reader.");
    UpdateWindow(hStaticWnd);
    ShowWindow(hMainWnd, SW_SHOW);
    SetForegroundWindow(hMainWnd);
    LockSetForegroundWindow(LSFW_LOCK);
    hr = WinBioVerifyWithCallback(
        sessionHandle,
        &identity,
        WINBIO_SUBTYPE_ANY,
        VerifyCallback,             // Callback function
        NULL                        // Optional context
    );
    CString msg;
    //msg.Format("Swipe processed - Unit ID: %d\n", unitId);
    //OutputDebugString(msg);

    lsr.Format("globals.last_scan_result = %d", globals.last_scan_result);
    OutputDebugString(lsr);
    while (globals.last_scan_result == BIO_INPROGRESS)
    {
        OutputDebugString("Waiting for verify...");

        lsr.Format("globals.last_scan_result = %d", globals.last_scan_result);
        OutputDebugString(lsr);

        MSG msg;
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT) break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else if (globals.last_scan_result == BIO_INPROGRESS)
        {
            WaitMessage();
        }
    }
    OutputDebugString("Waiting for verify DONE.");

    if (globals.last_scan_result == BIO_INPROGRESS)
    {
        globals.last_scan_result = BIO_CANCEL;
    }
    lsr.Format("globals.last_scan_result = %d", globals.last_scan_result);
    OutputDebugString(lsr);
    ShowWindow(hMainWnd, SW_HIDE);
    WinBioReleaseFocus();
    //LockSetForegroundWindow(LSFW_UNLOCK);
    if (sessionHandle != NULL)
    {
        WinBioCloseSession(sessionHandle);
        sessionHandle = NULL;
    }
    return globals.last_scan_result;
}
catch (...) {
    OutputDebugString("Verify catch Error");
}
return BIO_ERROR;

}

通过在SetForegroundWindow()之后添加SetFocus()解决。不确定为什么在Windows 7上需要此额外步骤。

SetForegroundWindow
在Windows 7上的宣传效果一样。我们需要查看您的代码。
unsigned int verifyUser7(string &userName) {

string libPath;

OutputDebugString("verifyUser7: getApplicationPath");

libPath = getApplicationPath();
//  HWND capwnd;


try {

    //Make sure path ends with backslash
    if (libPath[libPath.length() - 1] != '\\') libPath += "\\";
    string  userHash = getHash(userName);

    //Get timeout from globals
    int timeoutValue = globals.timeout * 1000;

    //Check to see if we need an infinite timeout
    if (globals.disable_timeout)
    {
        timeoutValue = 1000 * 60 * 5;
    }
    TotalTickCount = timeoutValue; //5 minutes
    startTick = GetTickCount();
    globals.last_scan_result = BIO_INPROGRESS;
    countdownTimer = SetTimer(hMainWnd, ID_COUNTDOWN, 1000, NULL);

    CString lsr;
    lsr.Format("globals.last_scan_result = %d", globals.last_scan_result);
    OutputDebugString(lsr);

    sessionHandle = NULL;
    HRESULT 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))
    {
        CString s;
        s.Format("WinBioOpenSession failed. hr = 0x%x\n", hr);
        OutputDebugString(s);
        KillTimer(hMainWnd, countdownTimer);
        ShowWindow(hMainWnd, SW_HIDE);
        LockSetForegroundWindow(LSFW_UNLOCK);
        if (sessionHandle != NULL)
        {
            WinBioCloseSession(sessionHandle);
            sessionHandle = NULL;
        }
        return BIO_ERROR;
    }

    // Find the identity of the user.
    WINBIO_IDENTITY identity = { 0 };
    hr = GetCurrentUserIdentity(&identity);
    if (FAILED(hr))
    {
        CString s;
        s.Format("User identity not found. hr = 0x%x\n", hr);
        OutputDebugString(s);
        KillTimer(hMainWnd, countdownTimer);
        ShowWindow(hMainWnd, SW_HIDE);
        LockSetForegroundWindow(LSFW_UNLOCK);
        if (sessionHandle != NULL)
        {
            WinBioCloseSession(sessionHandle);
            sessionHandle = NULL;
        }
        return BIO_USER_NOT_ENROLLED;
    }

    // Verify a biometric sample.
    WINBIO_UNIT_ID unitId = 0;
    WINBIO_REJECT_DETAIL rejectDetail = 0;
    BOOLEAN match = FALSE;
    OutputDebugString("Calling WinBioVerifyWithCallback");
    SetWindowText(hStaticWnd, "To sign in, scan your finger on the fingerprint reader.");
    UpdateWindow(hStaticWnd);
    ShowWindow(hMainWnd, SW_SHOW);
    SetForegroundWindow(hMainWnd);
    LockSetForegroundWindow(LSFW_LOCK);
    hr = WinBioVerifyWithCallback(
        sessionHandle,
        &identity,
        WINBIO_SUBTYPE_ANY,
        VerifyCallback,             // Callback function
        NULL                        // Optional context
    );
    CString msg;
    //msg.Format("Swipe processed - Unit ID: %d\n", unitId);
    //OutputDebugString(msg);

    lsr.Format("globals.last_scan_result = %d", globals.last_scan_result);
    OutputDebugString(lsr);
    while (globals.last_scan_result == BIO_INPROGRESS)
    {
        OutputDebugString("Waiting for verify...");

        lsr.Format("globals.last_scan_result = %d", globals.last_scan_result);
        OutputDebugString(lsr);

        MSG msg;
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT) break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else if (globals.last_scan_result == BIO_INPROGRESS)
        {
            WaitMessage();
        }
    }
    OutputDebugString("Waiting for verify DONE.");

    if (globals.last_scan_result == BIO_INPROGRESS)
    {
        globals.last_scan_result = BIO_CANCEL;
    }
    lsr.Format("globals.last_scan_result = %d", globals.last_scan_result);
    OutputDebugString(lsr);
    ShowWindow(hMainWnd, SW_HIDE);
    WinBioReleaseFocus();
    //LockSetForegroundWindow(LSFW_UNLOCK);
    if (sessionHandle != NULL)
    {
        WinBioCloseSession(sessionHandle);
        sessionHandle = NULL;
    }
    return globals.last_scan_result;
}
catch (...) {
    OutputDebugString("Verify catch Error");
}
return BIO_ERROR;