2010-03-10 10 views
5

Obecnie korzystam z narzędzia WM_DEVICECHANGE, aby otrzymywać powiadomienia, gdy nowe dyski USB są podłączone do komputera. Działa to doskonale na urządzeniach takich jak napędy USB, gdy tylko urządzenie dotrze, jest gotowe do odczytu plików z niego. W przypadku urządzeń takich, jak czytniki kart SD, nie dzieje się tak dlatego, że wiadomość jest wysyłana tylko raz, gdy urządzenie jest połączone, ale wiadomość nie jest wysyłana, gdy użytkownik rzeczywiście wkłada kartę do urządzenia.Wykrywanie włożenia nośnika do napędu za pomocą komunikatów systemu Windows

Czy można wykryć włożenie nowych mediów do istniejącego urządzenia USB bez konieczności korzystania z odpytywania?

+0

Sprawdź to pytanie http://stackoverflow.com/questions/583593/how-can-i-detect-when-an-sd-card-is-plugged-in –

+2

@Kirill: istnieje dobry powód, dla którego to pytanie brak akceptowanych odpowiedzi. Nie potrafią odróżnić "nowego dysku" od "wstawiania woluminu na istniejącym dysku". – MSalters

Odpowiedz

8

Po prostu zrobiłem to kilka tygodni temu. Technicznie rzecz biorąc, droga do rejestracji w systemie RegisterDevice jest właściwym sposobem, ale wymaga to przyzwoitej pracy. Jednak Eksplorator Windows już wykonuje całą ciężką pracę za Ciebie. Po prostu użyj SHChangeNotifyRegister z SHCNE_DRIVEADD/SHCNE_DRIVEREMOVED/SHCNE_MEDIAINSERTED/SHCNE_MEDIAREMOVED. Zauważ, że ta metoda zależy od usługi Wykrywania sprzętu powłoki (lub jakkolwiek jest nazywana), ale jest to znacznie łatwiejsze niż próba ponownego wdrożenia samej funkcjonalności.

+0

Dobre połączenie. Biblioteka, która implementuje, jest obecna w każdym systemie. Ale czy ustawienie rejestru DisableAutorunDriveType wpływa na to? –

+0

Nie przetestowałem tego, ale nie sądzę, że te dwa są połączone. Mechanizm ten jest używany w aplikacji "Odłącz Sprzęt Bezpiecznie"; nawet jeśli funkcja automatycznego uruchamiania jest wyłączona, ta aplikacja do obsługi tac nadal musi otrzymywać powiadomienia o przybyciu/usunięciu. – Luke

+3

Wiadomość SHCNE_MEDIAINSERTED jest wysyłana, nawet jeśli ustawienie rejestru DriveTypeAutoRun jest ustawione na wyłączenie wszystkich urządzeń. – rjschnorenberg

0

Może to być błąd w sterowniku czytnika kart SD. Opis w wersji WM_DEVICECHANGE to "DBT_DEVICEARRIVAL 0x8000 Urządzenie lub element multimedialny został wstawiony i jest już dostępny."

Dlatego należy uzyskać powiadomienie o włożeniu multimediów.

Czy próbowałeś używać RegisterDeviceNotification? Tylko niektóre powiadomienia są wysyłane domyślnie, a zmiana multimediów może nie być jedną z nich.

+0

Tak się składa, że ​​nowe powiadomienia o woluminie są wysyłane domyślnie. – MSalters

+0

W prawo, ale litera dysku (głośność) jest przypisana, gdy czytnik kart jest włożony.Powiadomienie o zmianie nośnika może wymagać usługi RegisterDeviceNotification. –

0

Być może jest to błąd w sterownikach urządzeń (myślę, że tak jest), ale wszystkie wydają się działać w taki sam sposób ... NIE. W tym momencie nie sądzę, że można zmusić dowolnego programistę do zmiany sterowników urządzeń, nawet jeśli Microsoft (prawdopodobnie największy programista) wierzy, że powinien działać w ten sposób (Nie działa dla mojego sterownika microsoft dla Windows7). Włożenie karty SD do urządzenia USB po prostu nie uruchamia komunikatu WM_DEVICECHANGE.

Użyj SHChangeNotifyRegister dla urządzeń typu mediów. Nie wymaga rejestracji. I możesz dostać literę dysku przez SHGetPathFromIDList. Użyj SHCNE_MEDIAINSERTED i SHCNE_MEDIAREMOVED.

Użycie urządzenia ONDeviceUważaj, jeśli szukasz urządzenia sprzętowego, a nie urządzenia multimedialnego, lub możesz napisać własny sterownik urządzenia.

Zobacz ten komentarz Kod CodeProject - Trapping windows messages

2

Jest bardzo dobrym przykładem wykorzystania SHChangeNotifyRegister w „Zmień Informuj Watcher próbka”. Pobierz go z tego adresu:

http://msdn.microsoft.com/en-us/library/dd940348.aspx#downloading

I wdrożone SHChangeNotifyRegister w moim kodu Qt.

Podziękowania dla Łukasza za bardzo dobrą odpowiedź!

+0

Jestem całkiem nowy - jeśli chodzi o miksowanie i wdrażanie kodu Windows (takie jak SHChangeNotifyRegister) z kodem Qt. Czy możesz dać mi wskazówki, jak z tym postępować? Każda pomoc jest doceniana !! – zeFree

Powiązane problemy