I'm a WinForms developer and I already knew how to monitor the USB's that connects or disconnects using WMI, but time ago I'd discovered the DeviceWatcher class for Modern Windows Apps, that Class has interested at first time 'cause seems like a very improved and efficient alternative to replace all those 'old' WMI codes that explains how to monitor drives over Internet, but until yesterday (thanks to this post) I haven't idea about how to use the DeviceWatcher in a WinForms project, but now I'm using the DeviceWatcher in a WinForms project.
The problem is that maybe I'm wrong but I think that this is not really what I expected, just I can't find any kind of documentation about the DeviceWatcher (only the MSDN example above) and I can't find the way to retrieve the necessary information to monitor the drive events, I've tried to handle all the events of the DeviceWatcher to print out in the Debug console all the data contained in the arguments with the hope to find something that could help me ...but not, I'm very stuck with the usage of the DeviceWatcher Class and I can't imagine how to procceed.
When I connect or disconnect an USB I just see two things, the Hardware ID and the 'InterfaceEnabled' property (that I don't know if that determines the Device Availability), nothing interesting more.
What I have accomplished:
· Retrieve the Hardware Device ID's.
What I would like to accomplish:
· Retrieve the Device type (to difference between USB and other kind of devices) when the device is connected, disconnecting, and disconnected.
· Retrieve the Device Availability (I mean whether the device is accessible to read/write data on it) when the device is connected, disconnecting, and disconnected.
· Retrieve the Device Letter when the device is connected, disconnecting, and disconnected.
· Retrieve the Device Label-Description when the device is connected, disconnecting, and disconnected.
The code:
Public Class DeviceWatcher_Test
Private WithEvents dw As DeviceWatcher = DeviceInformation.CreateWatcher
' It's suposed that these properties should exist in the "e.properties" on the "dw_updated" event?, not in my case.
' Dim props As String() = {"System.ItemNameDisplay", "System.Devices.ModelName", "System.Devices.Connected"}
Private Sub Test() Handles MyBase.Load
dw.Start()
End Sub
Private Sub dw_Added(ByVal sender As DeviceWatcher, ByVal e As DeviceInformation) _
Handles dw.Added
Dim sb As New System.Text.StringBuilder
With sb
.AppendLine("dw_added")
.AppendLine("********")
.AppendLine(String.Format("Interface ID.: {0}", e.Id))
.AppendLine(String.Format("Friendly Name: {0}", e.Name))
.AppendLine(String.Format("Is Enabled?..: {0}", e.IsEnabled))
End With
Debug.WriteLine(sb.ToString)
End Sub
Private Sub dw_Removed(ByVal sender As DeviceWatcher, ByVal e As DeviceInformationUpdate) _
Handles dw.Removed
Dim sb As New System.Text.StringBuilder
With sb
.AppendLine("dw_Removed")
.AppendLine("**********")
.AppendLine(String.Format("Interface ID:{0}", e.Id))
For Each item As KeyValuePair(Of String, Object) In e.Properties
.AppendLine(String.Format("TKey:{0}, TVal:{1} (TVal Type:{2})",
item.Key, item.Value.ToString, item.Value.GetType.Name))
Next
End With
Debug.WriteLine(sb.ToString)
End Sub
Private Sub dw_Updated(ByVal sender As DeviceWatcher, ByVal e As DeviceInformationUpdate) _
Handles dw.Updated
Dim sb As New System.Text.StringBuilder
With sb
.AppendLine("dw_Updated")
.AppendLine("**********")
.AppendLine(String.Format("Interface ID: {0}", e.Id))
For Each item As KeyValuePair(Of String, Object) In e.Properties
If item.Key.EndsWith("InterfaceEnabled", StringComparison.OrdinalIgnoreCase) Then
Dim Result As Boolean = CBool(item.Value)
' I'm not sure whether the 'Result' value really determines this:
.AppendLine(String.Format("The device is accessible?:{0}", CStr(Result)))
Else
.AppendLine(String.Format("TKwy:{0}, TVal:{1} (TVal Type:{2})",
item.Key, item.Value.ToString, item.Value.GetType.Name))
End If
Next
End With
Debug.WriteLine(sb.ToString)
End Sub
Private Sub dw_Stopped(ByVal sender As DeviceWatcher, ByVal e As Object) _
Handles dw.Stopped
Dim sb As New System.Text.StringBuilder
With sb
.AppendLine("dw_Stopped")
.AppendLine("**********")
.AppendLine(String.Format("e:{1} (e Type:{2})",
e.ToString, e.GetType.Name))
End With
Debug.WriteLine(sb.ToString)
End Sub
Private Sub dw_EnumerationCompleted(ByVal sender As DeviceWatcher, ByVal e As Object) _
Handles dw.EnumerationCompleted
If e IsNot Nothing Then
Dim sb As New System.Text.StringBuilder
With sb
.AppendLine("EnumerationCompleted")
.AppendLine("********************")
.AppendLine(String.Format("e:{1} (e Type:{2})",
e.ToString, e.GetType.Name))
End With
Debug.WriteLine(sb.ToString)
End If
End Sub
End Class
See Question&Answers more detail:os