2012-05-08 8 views
0

私たちは自分のタブレットを作っています。錠剤の中には指紋バイオメトリクスがあるものもあれば、そうでないものもあります。時には技術者がプラグインするのを忘れてしまいます。私はまだそのデバイス(またはそれについては何か)が存在するかどうかを確認する方法を見つけていません。私の最初のアプローチは、{53D29EF7-377C-4D14-864B-EB3A85769359}バイオメトリックのGUIDを使用することでした。 hklm \ system \ currontcontrolset \ control \ classのレジストリで検索し、そのキーが存在するかどうかを確認します。 Windows 7には、バイオメトリックがインストールされていない場合でも、キーが存在するように見えるという点では機能しません。それはXPで動作しましたが、私はバイオメトリックを使用していたユニットでもう一度試しましたが、私はそれを取り出し、そのキーはまだ存在しています。この問題の最も難しい部分は、Windows 7、7 embedded、xp、およびxp embeddedで作業する必要があることです。次のアイデアはWMIを使用することでしたが、正しいクラスが存在するかどうかを確認するために呼び出すことができませんでした。私はbiometric.dllを見つけましたが、それはwindows7でのみ動作します。時には、問題に対する共通の解決策を見つけることが必ずしも容易ではない。私はC#でこのプロジェクトをやっていますが、私はそれを任意の言語から変換するつもりです。どんなアイデアでも私は見始めるべきだったのですか?バイオメトリックが存在するかどうかを確認する方法がわかりません

+1

を動作するか検証するための簡単なユニットテストである[どのように私はプログラム的にシステムデバイスを無効にするには?](http://stackoverflow.com/questions/4097000/how-do-i-disable-a-system-device-programatically)があります。 –

+0

USBデバイスの場合[WinUSB機能を使用してUSBデバイスにアクセスする方法](http://msdn.microsoft.com/en-us/library/windows/hardware/ff540174%28v=vs.85%29) aspx)が役に立ちます。 –

答えて

1

私の問題を解決する方法について素晴らしいリンクをくれたジョシュア・ドレイクの助けを借りて、私は結果を投稿すると思った。私が投稿するように修正しているコードは、特定の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)); 
    } 
関連する問題