我正在开发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文件。
我该怎么做才能消除此错误?
谢谢。
答案 0 :(得分:0)
在WinBioOpenSession()之后立即添加AcquireFocus()。然后它将获取该会话的焦点并返回S_OK。