Windows生物识别框架:AcquireFocus()不起作用。错误AccessDenied:0x80070005

时间:2019-10-22 11:19:07

标签: c# windows-services wbf

我正在开发Windows服务以捕获指纹样本。 WBF(Windows Bio metric Framework)需要聚焦以捕获示例图像,对此我正在使用AcquireFocus()。

从DLL导出如下。

 class Focus
    {
        protected const string LibName = "winbio.dll";

        [DllImport(LibName, EntryPoint = "WinBioAcquireFocus")]
        public static extern WinBioErrorCode WinBioAcquireFocus();

        [DllImport(LibName, EntryPoint = "WinBioReleaseFocus")]
        public static extern WinBioErrorCode WinBioReleaseFocus();
    }

用法如下

WriteToFile(DateTime.Now + " Acquiring Focus" + "\n");
re = Focus.WinBioAcquireFocus();
if (re.Equals(WinBioErrorCode.Ok)){
    WriteToFile(DateTime.Now + " Calling CaptureSample Image." + "\n");
    result = wbf.CaptureSampleImage();
 }
 else{
     WriteToFile(DateTime.Now + " Error in Acquiring Focus: " + re + "\n");
  }

此功能要求该进程在documnetation中提及的LocalSystem帐户上运行。 我已经在服务设置中对此进行了设置。

this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;

CaptureSampleImage()在DLL中定义。 现在我总是收到错误0x80070005,这是访问被拒绝。日志文件如下。

10/22/2019 4:16:06 PM Acquiring Focus

10/22/2019 4:16:06 PM Error in Acquiring Focus: AccessDenied

10/22/2019 4:16:06 PM Stopping Service.

以下将错误代码定义为Enum

    public enum WinBioErrorCode
         : uint
    {
        Ok = 0,
        False = 1,
        AccessDenied = 0x80070005,
        ...
    }

documnetation说,这是由于服务不在LocalSystem上而引起的。

出于记录目的,我编写了writeToFile(message),将消息写入.txt文件。

我该怎么做才能消除此错误?

谢谢。

1 个答案:

答案 0 :(得分:0)

在WinBioOpenSession()之后立即添加AcquireFocus()。然后它将获取该会话的焦点并返回S_OK。