3

ハードウェア デバイス (具体的にはマルチタッチ デジタイザー) が無効になっているかどうかを確認しようとしています。

hereからDisableHardwareクラスを使用して、デバイスを正常に有効化/無効化できます。

プロパティHardwareDisabledを持つDEVICE_CAPABILITIES構造体を見つけました。しかし、 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が返されます。

4

0 に答える 0