[C# & WMI] USB detection events

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een ManagementEventWatcher gemaakt die events moet geven als er en USB drive beschikbaar komt.

Om deze te registreren heb ik deze code gemaakt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            private void RegisterUsbHandler(out ManagementEventWatcher EventWatcher, string eventName, EventArrivedEventHandler eventHandler)
            {
                // Create event query to be notified within 1 second of 
                // a change in a service
                WqlEventQuery query =
                    new WqlEventQuery(eventName,
                    new TimeSpan(0, 0, 1),
                    "TargetInstance isa \"Win32_USBControllerDevice\"");

                // Initialize an event watcher and subscribe to events 
                // that match this query
                EventWatcher = new ManagementEventWatcher();
                EventWatcher.EventArrived += eventHandler;
                EventWatcher.Query = query;
                EventWatcher.Start();
            }

en aangeroepen met :
code:
1
RegisterUsbHandler(out USBDriveInsertedWatcher, "__InstanceCreationEvent", USBDriveInserted);


Als ik een stick invoer dan krijg ik mooi events in mijn functie
code:
1
private void USBDriveInserted(object sender, EventArrivedEventArgs e){/* some code*/}

Maar deze word 2 of 3 keer aangeroepen per stick (is afhankelijk van de stick)

Ik ga er vanuit dat het events zijn als:
* physical connection
* starting mounting
* mounted

Het lukt me niet om onderscheid te maken tussen deze events en om er zeker van te zijn wanneer een stick gemount en helemaal klaar is om te gebruiken.

[ Voor 17% gewijzigd door Verwijderd op 14-01-2010 08:55 ]


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Ik denk dat je je probleem wel zal herkennen als je in het venster van "Safely Remove Hardware" even "Display Device Components" aanvinkt en dan jouw USB stick opzoekt.

Waarschijnlijk toont jouw USB stick zich dus als meerdere device componenten die 1 per 1 herkend worden.
Vermoedelijk moet je dus op zoek naar een event die getriggered wordt als er een fysisch volume wordt toegevoegd.

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@H!GHGuY: Als linker muisknop doe op het "Safely Remove Hardware" dan zie ik maar 1 Volume.

Als ik kijk waar jij me wijst zie ik:
USB Mass Storage Device
-> Kingston DataTravler 2.0 USB Device
-> Generic volume - (E:)

Bedoel je dat met meerdere device componenten?

Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 17-09 08:50
Windows maakt altijd meerdere devices volgens mij van je USB stick
(Volume = ntfs driver, en [naam van je usb stick] = usb mass storage driver)
Heb dat met al mijn sticks.. Mijn U3 stick, heeft zelfs nog meer devices (CD-Rom speler erbij)

Ik zou zoals HighGuY zegt, naar een Volume event luisteren...

Even niets...


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het Win32_VolumeChangeEvent is niet available op XP, en dat is wel mijn platform (zie: http://msdn.microsoft.com.../aa394558%28VS.85%29.aspx onderaan)

Ik heb het voor de zekerheid ook nog eventjes getest en het event kwam inderdaad niet.

Wat wel lijkt te werken is de base class Win32_DeviceChangeEvent, maar daar krijg ik 4 tot 6 events van :S

Het Win32_DeviceChangeEvent heeft een uint16 EventType die me misschien wel extra info kan leveren, maar ik krijg in m'n callback functies EventArrivedEventArgs mee en snap niet hoe dat ik aan het EventType kan komen dan.

[ Voor 23% gewijzigd door Verwijderd op 15-01-2010 10:02 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
verder niemand een idee hoe dat je kan herkennen wat de precieze aard van de events is?

een lijstje drives bij houden lijkt me een beetje nutteloos omdat Windows dat eigenlijk ook al doet natuurlijk,
Pagina: 1