detectar - controlar puerto usb con c#
¿Cómo detectar una unidad USB ha sido enchufado? (4)
Aquí hay un código que funciona para mí, que es una parte del sitio web anterior combinado con mis primeros ensayos: http://www.codeproject.com/KB/system/DriveDetector.aspx
Esto básicamente hace que su forma escuche los mensajes de Windows, filtros para unidades usb y (cd-dvds), capta la estructura lparam del mensaje y extrae la letra de la unidad.
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_DEVICECHANGE)
{
DEV_BROADCAST_VOLUME vol = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME));
if ((m.WParam.ToInt32() == DBT_DEVICEARRIVAL) && (vol.dbcv_devicetype == DBT_DEVTYPVOLUME) )
{
MessageBox.Show(DriveMaskToLetter(vol.dbcv_unitmask).ToString());
}
if ((m.WParam.ToInt32() == DBT_DEVICEREMOVALCOMPLETE) && (vol.dbcv_devicetype == DBT_DEVTYPVOLUME))
{
MessageBox.Show("usb out");
}
}
base.WndProc(ref m);
}
[StructLayout(LayoutKind.Sequential)] //Same layout in mem
public struct DEV_BROADCAST_VOLUME
{
public int dbcv_size;
public int dbcv_devicetype;
public int dbcv_reserved;
public int dbcv_unitmask;
}
private static char DriveMaskToLetter(int mask)
{
char letter;
string drives = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //1 = A, 2 = B, 3 = C
int cnt = 0;
int pom = mask / 2;
while (pom != 0) // while there is any bit set in the mask shift it right
{
pom = pom / 2;
cnt++;
}
if (cnt < drives.Length)
letter = drives[cnt];
else
letter = ''?'';
return letter;
}
No olvides agregar esto:
using System.Runtime.InteropServices;
y las siguientes constantes:
const int WM_DEVICECHANGE = 0x0219; //see msdn site
const int DBT_DEVICEARRIVAL = 0x8000;
const int DBT_DEVICEREMOVALCOMPLETE = 0x8004;
const int DBT_DEVTYPVOLUME = 0x00000002;
Quiero crear un programa que detecte si un usb (o dos o más) está conectado (y copie todo el contenido a cualquier carpeta en un disco duro)
¿Algunas ideas? Tengo esto,
using System.Runtime.InteropServices;
Pero no es la manera fácil (que yo creo). Quiero algo fácil.
Tengo otra idea (si (existe una carpeta) y luego copia) algo, pero puede haber un problema con eso, y quiero una buena solución.
También puede haber una herramienta llamada SerialPort; ¿Puedo usarlo? Si es así, ¿cómo lo uso?
Detectar si una unidad USB está insertada no es simple. Sin embargo, definitivamente es posible y el trabajo ha sido hecho para usted. Aquí hay dos enlaces que detallan una respuesta sobre cómo hacer esto en C #:
http://www.codeproject.com/KB/system/DriveDetector.aspx
http://www.codeproject.com/Messages/2126647/Re-Csharp-USB-Detection.aspx
Cualquiera de las soluciones debería funcionar bien para ti. Puede adaptarlos para satisfacer sus necesidades.
Editar: Aquí hay una tercera solución en caso de que desee más opciones (básicamente todas son iguales, pero la opción es buena, ¿no?):
Es fácil verificar si hay dispositivos extraíbles. Sin embargo, no hay garantía de que sea un dispositivo USB:
var drives = DriveInfo.GetDrives()
.Where(drive => drive.IsReady && drive.DriveType == DriveType.Removable);
Esto devolverá una lista de todos los dispositivos extraíbles que están actualmente accesibles. Más información:
- La clase DriveInfo (documentación msdn)
- La enumeración DriveType (documentación msdn)
Paquete de código API de Microsoft. Clase ShellObjectWatcher.