2009-05-28 75 views

回答

5

對於non-.NET語言,你添加一個消息處理程序WM_DEVICECHANGE消息,並檢查DBT_DEVICEREMOVECOMPLETE的WPARAM。 LPARAM指向DEV_BROADCAST_HDR結構;它是dbch_devicetype成員給出的設備類型。

3

下面是一些VB代碼,告訴你它是如何完成的。

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