2009-05-12 16 views
8

Desidero sapere quando un dispositivo USB è collegato al computer su cui è in esecuzione la mia applicazione Qt (in Windows). Nel mio QWidget principale, ho reimplementato winEventFilter come questo:Come sapere quando un nuovo dispositivo di archiviazione USB è collegato in Qt?

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

mi aspetto qDebug di inviare almeno qualcosa quando si collega un dispositivo USB, ma non ho ricevuto nulla.

Sto immaginando che sto fondamentalmente fraintendendo il processo qui - questa è la mia prima app Qt!

+1

Questo è interessante! – AndreasT

+1

@AndreasT - grazie! – Skilldrick

+0

Non so se hai ancora questo tuo progetto ma mi stavo chiedendo (come ho appena iniziato a imparare QT) se potessi averne una copia come riferimento. Non so ancora come sovrascrivere la procedura di WndProc e non ho ancora visto esempi validi. Né ho visto quelli buoni per Platform invoke per Qt. Grazie in anticipo. –

risposta

5

Credo che ciò che potrebbe mancare è la chiamata per registrarsi per la notifica del dispositivo. Ecco il codice che uso per fare la stessa cosa, anche se sovrascrivo il metodo winEvent() della classe QWidget e non il 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: È molto probabile necessità di modificare i valori del DEV_BROADCAST_DEVICEINTERFACE base alle proprie esigenze.

MODIFICA: per utilizzare questo codice è necessario includere i file di intestazione corretti ed eseguire la configurazione corretta. DEV_BROADCAST_DEVICEINTERFACE richiede l'inclusione dell'intestazione Dbt.h. Inoltre, il punto focale di questo codice si trova sulla funzione RegisterDeviceNotification. Info è disponibile su MSDN

+0

Mi spiace essere stupido, ma non riesco a far funzionare DEV_BROADCAST_DEVICEINTERFACE (errore: 'DEV_BROADCAST_DEVICEINTERFACE 'non è stato dichiarato in questo ambito). Devo includere file di intestazione aggiuntivi? – Skilldrick

+0

Non essere dispiaciuto. Ho avuto un momento difficile immaginandomi molto di questo. Spero che la mia modifica ti fornisca indicazioni su come usare il codice che ho dato. Potrebbe comunque non essere completo. Ho incluso il link a MSDN per darti una fonte per maggiori informazioni. Se avessi più tempo, proverei a darti una guida più completa su come implementarlo. Questo dovrebbe almeno portare i messaggi al tuo gestore. – brader24

-1

Questo collegamento a Trolltech mailing list potrebbe essere utile.

+0

L'ho trovato tramite Google, ma ad essere sincero mi ha confuso! Non riuscivo a credere che la domanda che sto chiedendo c. 150 righe di codice (che è la soluzione accettata in quel thread). Grazie comunque. – Skilldrick

+2

Per tutti quelli che vengono qui, quel collegamento è morto. –

+0

Dannazione! il link è davvero morto, qualche aggiornamento? – Xsmael

2

Sto lavorando sulla stessa linea ma in C#.

è necessario registrare la domanda con il sistema (guardare la funzione RegisterHidNotification()). Il mio aspetto: `

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 più importante della funzione è il bit ho evidenziato in grassetto (o almeno cercato di). Definito come: public Guid GUID_DEVINTERFACE_USB_DEVICE = new Guid("A5DCBF10-6530-11D2-901F-00C04FB951ED"); Spero che tu possa adattarlo alla tua applicazione.