2009-05-12 16 views
8

Chcę wiedzieć, kiedy urządzenie USB jest podłączone do komputera, na którym działa moja aplikacja Qt (w systemie Windows). W moim głównym QWidget, mam przepisany winEventFilter tak:Jak sprawdzić, czy nowe urządzenie pamięci masowej USB jest podłączone w Qt?

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

będę oczekiwać qDebug wysłać przynajmniej coś po podłączeniu urządzenia USB, ale nie dostać nic.

Zgaduję, że zasadniczo nie rozumiem procesu tutaj - jest to moja pierwsza aplikacja Qt!

+1

To jest interesujące! – AndreasT

+1

@AndreasT - dziękuję! – Skilldrick

+0

Nie wiem, czy nadal masz ten projekt, ale zastanawiałem się (jak właśnie zacząłem się uczyć QT), czy mogę uzyskać jego kopię w celach informacyjnych. Nie wiem, jak zastąpić procedurę wndProc jeszcze nie widziałem dobrych przykładów na to jeszcze. Nie widziałem też dobrych do wywołania platformy dla Qt. Z góry dzięki. –

Odpowiedz

5

Uważam, że może brakować połączenia, aby zarejestrować się w celu powiadomienia o urządzeniu. Oto kod, którego używam, aby zrobić to samo, chociaż nadpisuję metodę winEvent() klasy QWidget, a nie 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 

UWAGA: Będzie najprawdopodobniej trzeba zmienić wartości DEV_BROADCAST_DEVICEINTERFACE do swoich potrzeb.

EDYCJA: Aby użyć tego kodu, należy dołączyć odpowiednie pliki nagłówkowe i przeprowadzić poprawną konfigurację. DEV_BROADCAST_DEVICEINTERFACE wymaga dołączenia nagłówka Dbt.h. Ponadto centralnym punktem tego kodu jest funkcja RegisterDeviceNotification. Informacje są dostępne pod adresem: MSDN

+0

Przykro mi być głupim, ale nie mogę wykonać pracy DEV_BROADCAST_DEVICEINTERFACE (błąd: "DEV_BROADCAST_DEVICEINTERFACE" nie został zadeklarowany w tym zakresie). Czy muszę dołączyć dodatkowe pliki nagłówkowe? – Skilldrick

+0

Nie żałuj. Ciężko mi było samemu się tego dowiedzieć. Mam nadzieję, że moja edycja da ci wskazówki, jak użyć kodu, który dałem. To może jeszcze nie być kompletne. Podłączyłem link do MSDN, aby podać źródło dla dalszych informacji. Gdybym miał więcej czasu, starałbym się dokładniej wskazać, jak go wdrożyć. To naprawdę powinno przynajmniej dostarczyć wiadomości do twojego handler'a. – brader24

-1

Ten link do Trolltech mailing list może być przydatny.

+0

Znalazłem to przez Google, ale szczerze mówiąc, to mnie zdezorientowało! Nie mogłem całkowicie uwierzyć, że pytanie, które zadaję, wymaga c. 150 linii kodu (co było przyjętym rozwiązaniem w tym wątku). W każdym razie dzięki. – Skilldrick

+2

Dla wszystkich, którzy tu przychodzą, ten link jest martwy. –

+0

Cholera! link rzeczywiście jest martwy, każda aktualizacja? – Xsmael

2

Pracuję na tych samych zasadach, ale w języku C#.

musisz zarejestrować swoją aplikację w systemie (spójrz na funkcję RegisterHidNotification()). Kopalnia wygląda następująco: `

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(); 
     }` 

Najważniejszą częścią funkcji jest nieco mam pogrubione (albo przynajmniej próbował). Zdefiniowany jako: public Guid GUID_DEVINTERFACE_USB_DEVICE = new Guid("A5DCBF10-6530-11D2-901F-00C04FB951ED"); Mam nadzieję, że dostosujesz go do swojej aplikacji.

Powiązane problemy