Red de conocimiento informático - Conocimiento informático - Cómo activar y desactivar mediante programación el panel táctil de Windows

Cómo activar y desactivar mediante programación el panel táctil de Windows

API de SetupDi

usando System;

usando System.Text;

usando System.Collections.Generic;

usando DisableDevice;

usando System.Runtime.InteropServices;

usando System.ComponentModel;

usando Microsoft.Win32.SafeHandles;

usando System.Security;

usando System.Runtime.ConstrainedExecution;

usando System.Management;

espacio de nombres DisableDevice

{

[Flags()]

enumeración interna SetupDiGetClassDevsFlags

{

Predeterminado = 1,

Presente = 2,

Todas las clases = 4,

Perfil = 8,

Interfaz del dispositivo = (int)0x10

}

DiFunction de enumeración interna

{

SelectDevice = 1,

InstallDevice = 2,

AssignResources = 3,

Propiedades = 4,

Eliminar = 5,

FirstTimeSetup = 6,

FoundDevice = 7,

SelectClassDrivers = 8 ,

ValidateClassDrivers = 9,

InstallClassDrivers = (int)0xa,

CalcDiskSpace = (int)0xb,

DestroyPrivateData = ( int)0xc,

ValidateDriver = (int)0xd,

Detectar = (int)0xf,

InstallWizard = (int)0x10,

DestroyWizardData = (int)0x11,

PropertyChange = (int)0x12,

EnableClass = (int)0x13,

DetectVerify = (int) 0x14,

InstallDeviceFiles = (int)0x15,

UnRemove = (int)0x16,

SelectBestCompatDrv = (int)0x17,

AllowInstall = (int)0x18,

RegisterDevice = (int)0x19,

NewDeviceWizardPreSelect = (int)0x1a,

NewDeviceWizardSelect = (int)0x1b,

Asistente para nuevos dispositivosPreAnal

yze = (int)0x1c,

NewDeviceWizardPostAnalyze = (int)0x1d,

NewDeviceWizardFinishInstall = (int)0x1e,

Unused1 = (int)0x1f,

InstallInterfaces = (int)0x20,

DetectCancel = (int)0x21,

RegisterCoInstallers = (int)0x22,

AddPropertyPageAdvanced = (int)0x23,

AddPropertyPageBasic = (int)0x24,

Reservado1 = (int)0x25,

Solucionador de problemas = (int)0x26,

PowerMessageWake = (int)0x27,

AddRemotePropertyPageAdvanced = (int)0x28,

UpdateDriverUI = (int)0x29,

Reserved2 = (int) )0x30

}

enumeración interna StateChangeAction

{

Activar = 1,

Desactivar = 2,

PropChange = 3,

Inicio = 4,

Detener = 5

}

[Flags( )]

Ámbitos de enumeración interna

{

Global = 1,

ConfigSpecific = 2,

ConfigGeneral = 4

}

enumeración interna SetupApiError

{

NoAssociatedClass = unchecked((int)0xe0000200),

ClassMismatch = sin marcar((int)0xe0000201),

DuplicateFound = sin marcar((int)0xe0000202),

NoDriverSelected = sin marcar((int)0xe0000203),

KeyDoesNotExist = sin marcar((int)0xe0000204),

InvalidDevinstName = sin marcar((int)0xe0000205),

InvalidClass = sin marcar((int)0xe0000206),

DevinstAlreadyExists = sin marcar((int)0xe0000207),

DevinfoNotRegistered = sin marcar((int)0xe0000208),

InvalidRegProperty = sin marcar((int)0xe0000209), p>

NoInf = sin marcar((int)0xe000020a),

NoSuchHDevinst = sin marcar((int)0xe000020b),

CantLo

adClassIcon = sin marcar((int)0xe000020c),

InvalidClassInstaller = sin marcar((int)0xe000020d),

DiDoDefault = sin marcar((int)0xe000020e),

DiNoFileCopy = sin marcar((int)0xe000020f),

InvalidHwProfile = sin marcar((int)0xe0000210),

NoDeviceSelected = sin marcar((int)0xe0000211),

DevinfolistLocked = sin marcar((int)0xe0000212),

DevinfodataLocked = sin marcar((int)0xe0000213),

DiBadPath = sin marcar((int)0xe0000214),

NoClassInstallParams = sin marcar((int)0xe0000215),

FileQueueLocked = sin marcar((int)0xe0000216),

BadServiceInstallSect = sin marcar((int)0xe0000217),

NoClassDriverList = sin marcar((int)0xe0000218),

NoAssociatedService = sin marcar((int)0xe0000219),

NoDefaultDeviceInterface = sin marcar((int)0xe000021a), p>

DeviceInterfaceActive = sin marcar((int)0xe000021b),

DeviceInterfaceRemoved = sin marcar((int)0xe000021c),

BadInterfaceInstallSect = sin marcar((int)0xe000021d) ,

NoSuchInterfaceClass = sin marcar((int)0xe000021e),

InvalidReferenceString = sin marcar((int)0xe000021f),

InvalidMachineName = sin marcar((int)0xe0000220 ),

RemoteCommFailure = sin marcar((int)0xe0000221),

MachineUnavailable = sin marcar((int)0xe0000222),

NoConfigMgrServices = sin marcar((int) 0xe0000223),

InvalidPropPageProvider = sin marcar((int)0xe0000224),

NoSuchDeviceInterface = sin marcar((int)0xe0000225),

DiPostProcessingRequired = sin marcar((int) )0xe0000226 ),

No válido

COInstaller = sin marcar((int)0xe0000227),

NoCompatDrivers = sin marcar((int)0xe0000228),

NoDeviceIcon = sin marcar((int)0xe0000229),

InvalidInfLogConfig = sin marcar((int)0xe000022a),

DiDontInstall = sin marcar((int)0xe000022b),

InvalidFilterDriver = sin marcar((int)0xe000022c),

NonWindowsNTDriver = sin marcar((int)0xe000022d),

NonWindowsDriver = sin marcar((int)0xe000022e),

NoCatalogForOemInf = sin marcar((int)0xe000022f),

DevInstallQueueNonNative = sin marcar((int)0xe0000230),

NotDisableable = sin marcar((int)0xe0000231),

CantRemoveDevinst = sin marcar((int)0xe0000232),

InvalidTarget = sin marcar((int)0xe0000233),

DriverNonNative = sin marcar((int)0xe0000234),

InWow64 = sin marcar((int)0xe0000235), p>

SetSystemRestorePoint = sin marcar((int)0xe0000236),

IncorrectlyCopiedInf = sin marcar((int)0xe0000237),

SceDisabled = sin marcar((int)0xe0000238) ,

UnknownException = sin marcar((int)0xe0000239),

PnpRegistryError = sin marcar((int)0xe000023a),

RemoteRequestUnsupported = sin marcar((int)0xe000023b ),

NotAnInstalledOemInf = sin marcar((int)0xe000023c),

InfInUseByDevices = sin marcar((int)0xe000023d),

DiFunctionObsolete = sin marcar((int) 0xe000023e),

NoAuthenticodeCatalog = sin marcar((int)0xe000023f),

AuthenticodeDisallowed = sin marcar((int)0xe0000240),

AuthenticodeTrustedPublisher = sin marcar((int) )0xe0000241 ),

AuthenticodeTrustNotEstablished = un

check((int)0xe0000242),

AuthenticodePublisherNotTrusted = unchecked((int)0xe0000243),

SignatureOSAttributeMismatch = unchecked((int)0xe0000244),

OnlyValidateViaAuthenticode = unchecked((int)0xe0000245)

}

[StructLayout(LayoutKind.Sequential)]

estructura interna DeviceInfoData

{

tamaño int público;

Guid de clase de guía pública;

Int Dev int público;

Ptr Int público reservado;

}

[StructLayout(LayoutKind.Sequential)]

estructura interna PropertyChangeParameters

{

tamaño int público;

// parte del encabezado Está aplanado en 1 estructura.

DiFunction DiFunction pública;

StateChangeAction StateChange público;

Alcance de ámbitos públicos; p>

public int HwProfile;

}

clase interna NativeMethods

{

private const string setupapi = " setupapi.dll";

private NativeMethods()

{

}

[DllImport(setupapi, CallingConvention = CallingConvention.Winapi, SetLastError = true)]

[return: MarshalAs(UnmanagedType.Bool)]

bool externo estático público SetupDiCallClassInstaller(DiFunction installFunction, SafeDeviceInfoSetHandle deviceInfoSet, [In()]

ref DeviceInfoData deviceInfoData);

[DllImport(setupapi, CallingConvention = CallingConvention.Winapi, SetLastError = true)]

[return: MarshalAs(UnmanagedType.Bool)]

bool externo estático público SetupDiEnumDeviceInfo(SafeDeviceInfoSetHandle deviceInfoSet, int memberIndex, ref DeviceInfoData deviceInfo

Data);

[DllImport(setupapi, CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode, SetLastError = true)]

público externo estático SafeDeviceInfoSetHandle SetupDiGetClassDevs([In()]

ref Guid classGuid, [MarshalAs(UnmanagedType.LPWStr)]

enumerador de cadenas, IntPtr hwndParent, banderas SetupDiGetClassDevsFlags);

/*

[DllImport(setupapi, CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode, SetLastError = true)]

[return: MarshalAs(UnmanagedType.Bool)]

público estático extern bool SetupDiGetDeviceInstanceId(SafeDeviceInfoSetHandle deviceInfoSet, [In()]

ref DeviceInfoData hizo, [MarshalAs(UnmanagedType.LPTStr)]

StringBuilder deviceInstanceId, int deviceInstanceIdSize, [Out()]

ref int requireSize);

*/

[DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)]

[return: MarshalAs(UnmanagedType.Bool)]

bool externo estático público SetupDiGetDeviceInstanceId(

IntPtr DeviceInfoSet,

ref DeviceInfoData hizo, p>

[MarshalAs(UnmanagedType.LPTStr)] StringBuilder DeviceInstanceId,

int DeviceInstanceIdSize,

out int RequiredSize

);

[SuppressUnmanagedCodeSecurity()]

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]

[DllImport(setupapi, CallingConvention = CallingConvention.Winapi, SetLastError = true) ]

[retorno: MarshalAs(UnmanagedType.Bool)]

bool externo estático público SetupDiDestroyDeviceInfoList(I

ntPtr deviceInfoSet);

[DllImport(setupapi, CallingConvention = CallingConvention.Winapi, SetLastError = true)]

[return: MarshalAs(UnmanagedType.Bool)]

público estático extern bool SetupDiSetClassInstallParams(SafeDeviceInfoSetHandle deviceInfoSet, [In()]

ref DeviceInfoData deviceInfoData, [In()]

ref PropertyChangeParameters classInstallParams, int classInstallParamsSize);

}

clase interna SafeDeviceInfoSetHandle: SafeHandleZeroOrMinusOneIsInvalid

{

público SafeDeviceInfoSetHandle()

: base(verdadero)

{

}

anulación protegida bool ReleaseHandle()

{

return NativeMethods.SetupDiDestroyDeviceInfoList(this.handle) ;

}

}

DeviceHelper de clase pública sellada

{

DeviceHelper privado()

{

}

///

/// Activar o desactivar un dispositivo.

/ //

/// El guid de clase del dispositivo Disponible en el administrador de dispositivos.

// / El ID de instancia del dispositivo disponible en el administrador de dispositivos.

/// Verdadero para habilitar, Falso. para deshabilitar.

/// Lanzará una excepción si el dispositivo no está deshabilitado.

public static void SetDeviceEnabled(Guid classGuid, cadena ID de instancia, bool enable)

{

SafeDeviceInfoSetHandle diSetHandle = null;

prueba

{

/ / Ge

t el identificador de un conjunto de información de dispositivo para todos los dispositivos que coinciden con classGuid que están presentes en el

// sistema.

diSetHandle = NativeMethods.SetupDiGetClassDevs(ref classGuid, null, IntPtr.Zero , SetupDiGetClassDevsFlags.Present);

// Obtenga los datos de información del dispositivo para cada dispositivo coincidente.

DeviceInfoData[] diData = GetDeviceInfoData(diSetHandle);

/ / Encuentre el índice de nuestra instancia, es decir, el mouse del panel táctil: tengo 3 ratones conectados...

int index = GetIndexOfInstance(diSetHandle, diData,stanceId);

// Deshabilitar. ...

EnableDevice(diSetHandle, diData[index], enable);

}

finalmente

{

if (diSetHandle != null)

{

if (diSetHandle.IsClosed == false)

{

diSetHandle .Close();

}

diSetHandle.Dispose();

}

}

}

DeviceInfoData estático privado[] GetDeviceInfoData(SafeDeviceInfoSetHandle handle)

{

List data = new List();

DeviceInfoData did = new DeviceInfoData();

int didSize = Marshal.SizeOf(did);

did.Size = didSize;

int index = 0;

mientras (NativeMethods.SetupDiEnumDeviceInfo(handle, index, ref did))

{

data.Add(did);

índice += 1;

did = new DeviceInfoData();

did.Size = didSize;

}

return data.ToArray();

}

// Encuentre el índice del DeviceInfoData particular para el ID de instancia.

private static int GetIndexOfInstance(SafeDeviceInfoSetHandle handle

e, DeviceInfoData[] diData, stringstanceId)

{

const int ERROR_INSUFFICIENT_BUFFER = 122;

for (int index = 0; index <= diData. Longitud - 1; índice++)

{

StringBuilder sb = new StringBuilder(1);

int requireSize = 0;

bool resultado = NativeMethods.SetupDiGetDeviceInstanceId(handle.DangerousGetHandle(), ref diData[index], sb, sb.Capacity, out requireSize);

if (resultado == false && Marshal.GetLastWin32Error() == ERROR_INSUFFICIENT_BUFFER )

{

sb.Capacity = requireSize;

resultado = NativeMethods.SetupDiGetDeviceInstanceId(handle.DangerousGetHandle(), ref diData[index], sb, sb .Capacidad, tamaño requerido);

}

si (resultado == falso)

lanzar nueva excepción Win32();

if (instanceId.Equals(sb.ToString()))

{

índice de retorno;

}

}

// no encontrado

return -1;

}

// habilitar/deshabilitar...

privado estático void EnableDevice(SafeDeviceInfoSetHandle handle, DeviceInfoData diData, bool enable)

{

PropertyChangeParameters @params = new PropertyChangeParameters();

// El tamaño es solo el tamaño del encabezado, pero hemos aplanado la estructura.

// El encabezado comprende los dos primeros campos, ambos enteros.

@params.Size = 8;

@params.DiFunction = DiFunction.PropertyChange;

@params.Scope = Scopes.Global;

if (habilitar)

{

@params.StateChange = StateChangeAction.Enable;

}

else

{

@params.StateChange = EstadoCha

ngeAction.Disable;

}

resultado bool = NativeMethods.SetupDiSetClassInstallParams(handle, ref diData, ref @params, Marshal.SizeOf(@params));

si (resultado == false) lanza nueva Win32Exception();

resultado = NativeMethods.SetupDiCallClassInstaller(DiFunction.PropertyChange, handle, ref diData);

if (resultado == false) )

{

int err = Marshal.GetLastWin32Error();

if (err == (int)SetupApiError.NotDisableable)

throw new ArgumentException("El dispositivo no se puede desactivar (programáticamente o en el Administrador de dispositivos)".);

else if (err >= (int)SetupApiError.NoAssociatedClass && err <= (int)SetupApiError .OnlyValidateViaAuthenticode)

lanzar nueva Win32Exception("Error de configuración de API: " + ((SetupApiError)err).ToString());

else

lanzar nueva Win32Exception ();

}

}

}

}