2009-05-28 83 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