2009-05-28 8 views

Répondre

5

Pour les langues non-.NET, vous ajoutez un gestionnaire de messages pour le message WM_DEVICECHANGE et pour identifier un wParam DBT_DEVICEREMOVECOMPLETE. La partition LPARAM pointe vers une structure DEV_BROADCAST_HDR; c'est membre dbch_devicetype donne le devicetype.

3

Voici un code VB qui vous montre comment cela est fait.

Shared Sub Main(ByVal args() As String) 
     Dim we As New WMIEvent 
     Dim w As ManagementEventWatcher = Nothing 
     Dim q As WqlEventQuery 
     Dim observer As New ManagementOperationObserver 

     ' Bind to local machine 
     Dim opt As New ConnectionOptions 
     opt.EnablePrivileges = True 'sets required privilege 
     Dim scope As New ManagementScope("root\CIMV2", opt) 

     Try 
      q = New WqlEventQuery 
      q.EventClassName = "__InstanceModificationEvent" 
      q.WithinInterval = New TimeSpan(0, 0, 1) 

      ' DriveType - 5: CDROM 
      q.Condition = "TargetInstance ISA 'Win32_LogicalDisk'" & _ 
       " and TargetInstance.DriveType = 5" 
      w = New ManagementEventWatcher(scope, q) 

      ' register async. event handler 
      AddHandler w.EventArrived, AddressOf we.CDREventArrived 
      w.Start() 

      ' Do something usefull,block thread for testing 
      Console.ReadLine() 
     Catch e As Exception 
      Console.WriteLine(e.Message) 
     Finally 
      w.Stop() 
     End Try 

    End Sub 'Main 


    ' Dump all properties 
    Public Sub CDREventArrived(ByVal sender As Object, ByVal e As EventArrivedEventArgs) 
     ' Get the Event object and display it 
     Dim pd As PropertyData = e.NewEvent.Properties("TargetInstance") 

     If Not (pd Is Nothing) Then 
      Dim mbo As ManagementBaseObject = pd.Value ' 

      ' if CD removed VolumeName == null 
      If Not (mbo.Properties("VolumeName").Value Is Nothing) Then 
       Console.WriteLine("CD has been inserted") 
      Else 
       Console.WriteLine("CD has been ejected") 
      End If 
     End If 

    End Sub 'CDREventArrived