0

我正在开发一个 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");
  }

此功能要求进程在文档中提到的 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,
        ...
    }

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

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

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

提前致谢。

4

1 回答 1

0

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

于 2019-10-23T13:13:32.540 回答