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> 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> 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> 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> 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)] p>
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> 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.
///
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
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)
{ p>
@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 ();
}
}
}
}