2009-05-12 11 views
8

Quiero saber cuando un dispositivo USB está conectado a la computadora en la que se ejecuta mi aplicación Qt (en Windows). En mi QWidget principal, he Reimplementado winEventFilter así:¿Cómo saber cuándo se conecta un nuevo dispositivo de almacenamiento USB en Qt?

bool winEventFilter (MSG * msg, long * result) { 
    qDebug() << msg; 
    return false; 
} 

yo esperaría qDebug para enviar al menos algo cuando conecto un dispositivo USB, pero no consigo nada.

Supongo que básicamente estoy malentendiendo el proceso aquí - ¡esta es mi primera aplicación Qt!

+1

¡Esto es interesante! – AndreasT

+1

@Areaste - ¡gracias! – Skilldrick

+0

No sé si todavía tiene este proyecto suyo, pero me preguntaba (ya que recién comencé a aprender QT) si podría obtener una copia para referencia. Aún no sé cómo anular el procedimiento de wndProc y aún no he visto buenos ejemplos para él. Tampoco he visto buenos para la invocación de plataforma para Qt. Gracias de antemano. –

Respuesta

5

Creo que lo que se puede perder es la llamada para registrarse para la notificación del dispositivo. Aquí está el código que uso para hacer lo mismo, aunque anulo el método winEvent() de la clase QWidget y no el winEventFilter.

// Register for device connect notification 
DEV_BROADCAST_DEVICEINTERFACE devInt; 
ZeroMemory(&devInt, sizeof(devInt)); 
devInt.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); 
devInt.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; 
devInt.dbcc_classguid = GUID_DEVINTERFACE_VOLUME; 

m_hDeviceNotify = 
    RegisterDeviceNotification(winId(), &devInt, DEVICE_NOTIFY_WINDOW_HANDLE); 
if(m_hDeviceNotify == NULL) 
{ 
    qDebug() << "Failed to register device notification"; 
} // end if 

NOTA: Lo más probable es que tenga que cambiar los valores de la DEV_BROADCAST_DEVICEINTERFACE para adaptarse a sus necesidades.

EDITAR: Para usar este código, deberá incluir los archivos de encabezado adecuados y realizar la configuración correcta. DEV_BROADCAST_DEVICEINTERFACE requiere que se incluya el encabezado Dbt.h. Además, el punto focal de este código está en la función RegisterDeviceNotification. La información está disponible en MSDN

+0

Lamento ser tonto, pero no puedo hacer que DEV_BROADCAST_DEVICEINTERFACE funcione (error: 'DEV_BROADCAST_DEVICEINTERFACE 'no se ha declarado en este ámbito). ¿Debo incluir archivos de encabezado adicionales? – Skilldrick

+0

No se arrepienta. Me costó trabajo calcular mucho de esto yo mismo. Esperemos que mi edición le dará alguna orientación sobre cómo usar el código que di. Sin embargo, puede que aún no sea completo. Incluí el enlace a MSDN para darle una fuente de más información. Si tuviera más tiempo, trataría de darle una dirección más completa sobre cómo implementarlo. Esto realmente debería al menos llevar los mensajes a su controlador. – brader24

-1

Este enlace a Trolltech mailing list podría ser útil.

+0

Lo encontré a través de Google, pero para ser honesto, ¡me confundió! No podía creer que la pregunta que estoy haciendo requiera c. 150 líneas de código (que es lo que fue la solución aceptada en ese hilo). Gracias sin embargo. – Skilldrick

+2

Para todos los que vienen aquí, ese enlace está muerto. –

+0

¡Maldición! el enlace está muerto, ¿alguna actualización? – Xsmael

2

Estoy trabajando en la misma línea pero en C#.

necesita registrar su aplicación en el sistema (consulte la función RegisterHidNotification()). El mío se parece a esto: `

void RegisterHidNotification() //Register this application to recieve all USB device notices 

     { 
      BroadcastHeader dbi = new BroadcastHeader(); 
      int size = Marshal.SizeOf(dbi); 
      dbi.Size = size; 
      dbi.Type = DeviceType.DeviceInterface; 
      **dbi.Classguid = GUID_DEVINTERFACE_USB_DEVICE**; 
      dbi.Name = 0; 
      IntPtr buffer = Marshal.AllocHGlobal(size); 
      Marshal.StructureToPtr(dbi, buffer, true); 
      IntPtr r = RegisterDeviceNotification(this.Handle, buffer, (int)DeviceEvents.regWindowHandle); 
      if (r == IntPtr.Zero) 
       statusLabel.Text = GetLastError().ToString(); 
     }` 

La parte más importante de la función es el bit He resaltado en negrita (o al menos intentaron). Definido como: public Guid GUID_DEVINTERFACE_USB_DEVICE = new Guid("A5DCBF10-6530-11D2-901F-00C04FB951ED"); Espero que pueda adaptarlo a su aplicación.

Cuestiones relacionadas