2009-05-27 32 views
9

Me gustaría hacer un ciclo (simular desenchufar y volver a insertar) un dispositivo USB (módem) después de que se haya disparado un determinado evento. He encontrado una muestra de CodeProject:¿Cómo puedo ciclar un dispositivo USB desde C#?

http://www.codeproject.com/KB/system/usbeject.aspx

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:

http://www.tech-archive.net/Archive/Development/microsoft.public.development.device.drivers/2005-02/1292.html

No entiendo.

Esto se ha mencionado en otros puestos relacionados con USB:

http://www.codeproject.com/KB/system/DriveDetector.aspx

No es relevante para mi problema.

+0

¿Qué quiere decir con reciclaje? ¿Te refieres a un reinicio suave? ¿O quiere decir "moverlo a la papelera de reciclaje"? – Randolpho

+0

reiniciar, al igual que quitar el dispositivo y volver a insertarlo. – callisto

+0

Consulte mi respuesta a este problema a continuación – callisto

Respuesta

12

Lo tengo trabajando usando una herramienta de línea de comandos llamada devcon, que luego llamé desde el código.

Eliminado devcon.exe en una de las rutas del sistema para que funcione en todas partes.

Devcon: devcon

llamada: DEVCON Eliminar * USB "* MI_01"

luego llamó: DEVCON rescan

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(); 
+1

Sería bueno si pudiera agregar un enlace a devcon y algún código de ejemplo para que otras personas puedan aprender. – Kinlan

+1

devcon en http://support.microsoft.com/kb/311272 – callisto

+0

Tenía un dispositivo (controlador de pantalla táctil) con el que hice algo similar, pero en realidad tuve que quitar/volver a explorar en el HUB para que funcione. Pudo haber sido un cubo de mierda, 9 y sin duda fue un chivo conductor), pero la eliminación en el dispositivo todavía lo dejó encendido, y la eliminación del centro realmente corta la energía. – Dolphin

3

Puede utilizar el C# Hardware Helper Lib y añadir el ResetDevice function.

Sólo asegúrese de añadir

public const int DICS_PROPCHANGE = ((0x00000003)); 

en el 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; 
} 
Cuestiones relacionadas