¿Cómo puedo ciclo de un dispositivo USB de C #?
-
06-09-2019 - |
Pregunta
Me gustaría ciclo (simular desenchufe y volver a insertar) un dispositivo USB (módem) después de un determinado evento ha disparado. He encontrado una muestra de CodeProject:
Eso me permite identificar y eyectar el dispositivo a través de su serie no volátil, pero lo necesito para reciclar, no sólo expulsar.
He leído esto:
No entiendo a él.
Esto ha sido mencionado en otros puestos relacionados con USB:
No es relevante para mi problema.
Solución
tengo trabajo mediante el uso de una herramienta de línea de comandos llamada devcon, que luego me llamó desde código.
Caído devcon.exe en una de las rutas del sistema por lo que funciona en todas partes.
Devcon: devcon
llamada: DEVCON Eliminar * USB "* MI_01"
A continuación, se llama: DEVCON vuelva a explorar
código:
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "DEVCON";
proc.StartInfo.Arguments = "Remove *usb"*MI_01";
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.Start();
Otros consejos
Puede utilizar el C # Hardware ayudante Lib y añadir la ResetDevice función .
Sólo asegúrese de añadir
public const int DICS_PROPCHANGE = ((0x00000003));
en la public class Native
bajo // PARMS,
public bool ResetDevice( IntPtr hDevInfo, IntPtr devInfoData )
{
int szOfPcp;
IntPtr ptrToPcp;
int szDevInfoData;
IntPtr ptrToDevInfoData;
Native.SP_PROPCHANGE_PARAMS pcp = new Native.SP_PROPCHANGE_PARAMS();
pcp.ClassInstallHeader.cbSize = Marshal.SizeOf(typeof(Native.SP_CLASSINSTALL_HEADER));
pcp.ClassInstallHeader.InstallFunction = Native.DIF_PROPERTYCHANGE;
pcp.StateChange = Native.DICS_PROPCHANGE; // for reset
pcp.Scope = Native.DICS_FLAG_CONFIGSPECIFIC;
pcp.HwProfile = 0;
szOfPcp = Marshal.SizeOf(pcp);
ptrToPcp = Marshal.AllocHGlobal(szOfPcp);
Marshal.StructureToPtr(pcp, ptrToPcp, true);
szDevInfoData = Marshal.SizeOf(devInfoData);
ptrToDevInfoData = Marshal.AllocHGlobal(szDevInfoData);
Marshal.StructureToPtr(devInfoData, ptrToDevInfoData, true);
bool rslt1 = Native.SetupDiSetClassInstallParams(hDevInfo, ptrToDevInfoData, ptrToPcp, Marshal.SizeOf(typeof(Native.SP_PROPCHANGE_PARAMS)));
bool rstl2 = Native.SetupDiCallClassInstaller(Native.DIF_PROPERTYCHANGE, hDevInfo, ptrToDevInfoData);
if (rslt1 && rstl2)
{
return true;
}
return false;
}