gpt4 book ai didi

c# - 无法弄清楚如何检查生物识别是否存在

转载 作者:行者123 更新时间:2023-11-30 22:28:55 24 4
gpt4 key购买 nike

在工作中,我们制作自己的平板电脑。有些平板电脑具有指纹生物识别技术,有些则没有。有时技术人员会忘记插入它。我还没有找到一种方法来检查该设备(或任何与此相关的设备)是否存在。

我的第一种方法是将 GUID 用于生物识别,即 {53D29EF7-377C-4D14-864B-EB3A85769359}。我会在 hklm\system\currontcontrolset\control\class 的注册表中搜索并检查该 key 是否存在。

这不起作用,因为即使您从未安装过生物识别,Windows 7 似乎也有该 key 。它在 XP 中有效,但我只是在一个曾经具有生物识别功能的设备上再次尝试,但我将其取出并且该 key 仍然存在。

这个问题最难的部分是我必须使用 Windows 7、7 embedded、xp 和 xp embedded。

下一个想法是使用 WMI,但我找不到正确的类来调用以检查它是否存在。

然后我找到了一个 biometric.dll 但它只适用于 Windows 7。

有时找到问题的通用解决方案并不总是那么容易。我正在用 C# 做这个项目,但我愿意将它转换成任何语言。

关于我应该开始寻找的任何想法吗?

最佳答案

在 Joshua Drake 的帮助下,他给了我一个关于如何解决我的问题的很棒的链接,这些是我的结果:

我修复后发布的代码有点特殊,因为它会查找特定的 GUID 并且查找第一个。我从关于如何禁用设备的文章中改编了它,尽管这段代码不会禁用任何它只是检查是否存在。

    public static bool IsDevicePresent(string guid)
{
var info = IntPtr.Zero;
var NullGuid = new Guid(guid);
try
{
info = SetupDiGetClassDevsW(ref NullGuid,null,IntPtr.Zero,DIGCF_PRESENT);
CheckError("SetupDiGetClassDevs");
var devdata = new SP_DEVINFO_DATA();
devdata.cbSize = (UInt32)Marshal.SizeOf(devdata);
// Get first device matching device criterion.
SetupDiEnumDeviceInfo(info,0,out devdata);
// if no items match filter, throw
if (Marshal.GetLastWin32Error() == ERROR_NO_MORE_ITEMS)
CheckError("No device found matching filter.", 0xcffff);
CheckError("SetupDiEnumDeviceInfo");
}
catch
{
return false;
}
finally
{
if (info != IntPtr.Zero)
SetupDiDestroyDeviceInfoList(info);
}
return true;
}

private static void CheckError(string message, int lasterror = -1)
{
int code = lasterror == -1 ? Marshal.GetLastWin32Error() : lasterror;
if (code != 0)
throw new ApplicationException(String.Format("Error disabling hardware device (Code {0}): {1}",code, message));
}

[DllImport("setupapi.dll", SetLastError = true)]
private static extern IntPtr SetupDiGetClassDevsW([In] ref Guid ClassGuid,[MarshalAs(UnmanagedType.LPWStr)]string Enumerator,IntPtr parent,UInt32 flags);

[DllImport("setupapi.dll", SetLastError = true)]
private static extern bool SetupDiDestroyDeviceInfoList(IntPtr handle);

[DllImport("setupapi.dll", SetLastError = true)]
private static extern bool SetupDiEnumDeviceInfo(IntPtr deviceInfoSet,UInt32 memberIndex,[Out] out SP_DEVINFO_DATA deviceInfoData);
//used to find device info from device manager
[StructLayout(LayoutKind.Sequential)]
private struct SP_DEVINFO_DATA
{
public UInt32 cbSize;
public Guid classGuid;
public UInt32 devInst;
public IntPtr reserved;
}
private const uint DIGCF_PRESENT = 2;
private const uint ERROR_INVALID_DATA = 13;
private const uint ERROR_NO_MORE_ITEMS = 259;
private const uint ERROR_ELEMENT_NOT_FOUND = 1168;

这是一个简单的单元测试来证明它适用于第一台设备

    [Test]
public void TestDevicePresent()
{
var bluetoothClassGuid = "e0cbf06c-cd8b-4647-bb8a-263b43f0f974";
var biometricClassGuid = "53D29EF7-377C-4D14-864B-EB3A85769359";
var cdromdrivClassGiud = "4d36e965-e325-11ce-bfc1-08002be10318";
Assert.False(Native.IsDevicePresent(bluetoothClassGuid));
Assert.False(Native.IsDevicePresent(biometricClassGuid));
Assert.True(Native.IsDevicePresent(cdromdrivClassGiud));
}

关于c# - 无法弄清楚如何检查生物识别是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10503565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com