2
我的程序需要知道用戶何時彈出cd光盤。 Windows中是否存在某種通知?Windows彈出CD彈出通知
我的程序需要知道用戶何時彈出cd光盤。 Windows中是否存在某種通知?Windows彈出CD彈出通知
對於non-.NET語言,你添加一個消息處理程序WM_DEVICECHANGE消息,並檢查DBT_DEVICEREMOVECOMPLETE的WPARAM。 LPARAM指向DEV_BROADCAST_HDR結構;它是dbch_devicetype成員給出的設備類型。
下面是一些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