C#如何获取硬件设备的功能HardwareDisabled属性

时间:2012-12-01 05:57:15

标签: c# device-driver human-interface

我想知道硬件设备(特别是多点触控数字转换器)是否禁用

我可以使用here中的 DisableHardware 类成功启用/停用设备。

我找到了 DEVICE_CAPABILITIES 结构,其属性为 HardwareDisabled 。但是,如果我调用 SetupDiGetDeviceRegistryPropertyW ,要返回SPDRP_CAPABILITIES,我无法将返回值(DWORD)转换为有用的uint。

我认为我的转换错误来自byte [] => uint,我总是得到128。

private static bool IsDeviceHardwareDisabeld(IntPtr info, SP_DEVINFO_DATA devdata)
{
    Trace.WriteLine("IsDeviceHardwareDisabeld");
    uint SPDRP_CAPABILITIES = 0x0000000F;
    uint CM_DEVCAP_HARDWAREDISABLED = 16384u;

    uint propId = SPDRP_CAPABILITIES;

    uint proptype, outsize;
    IntPtr buffer = IntPtr.Zero;
    try
    {
        uint buflen = 512;
        buffer = Marshal.AllocHGlobal((int)buflen);
        outsize = 0;
        SetupDiGetDeviceRegistryPropertyW(
            info,
            ref devdata,
            propId,
            out proptype,
            buffer,
            buflen,
            ref outsize);
        Trace.WriteLine("OUTSIZE: " + outsize.ToString()); // 4
        byte[] lbuffer = new byte[outsize];
        Marshal.Copy(buffer, lbuffer, 0, (int)outsize);
        int errcode = Marshal.GetLastWin32Error();
        if (errcode == ERROR_INVALID_DATA) throw new Exception("ERROR_INVALID_DATA");
        CheckError("SetupDiGetDeviceRegistryPropertyW", errcode);

        uint capabilities = BitConverter.ToUInt32(lbuffer, 0); // always 128
        uint bitwise = capabilities & CM_DEVCAP_HARDWAREDISABLED; // always 0
        bool isHardwareDisabled = bitwise > 0;
        Trace.WriteLine("HARDWAREDISABLED: " + isHardwareDisabled.ToString());
        return isHardwareDisabled;
    }
    finally
    {
        if (buffer != IntPtr.Zero)
            Marshal.FreeHGlobal(buffer);
    }
}

对于DEVICE_CAPABILITIES的值,我的转换始终返回 128

0 个答案:

没有答案