My program needs to know when a user ejects cd disc. Is there some sort of notification for this in Windows?
+1
A:
Here is some VB code that shows you how its done.
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
Jon
2009-05-28 14:43:03
+2
A:
For non-.NET languages, you add a message handler for the WM_DEVICECHANGE message and check for a WPARAM of DBT_DEVICEREMOVECOMPLETE. The LPARAM points to a DEV_BROADCAST_HDR structure; it's dbch_devicetype member gives the devicetype.
Ken White
2009-05-28 14:57:41