Я разработчик WinForms, и я уже знал, как контролировать USB, который подключается или отключается с помощью WMI, но время назад я обнаружил DeviceWatcher класс для современных приложений Windows, этот класс впервые заинтересовался, потому что кажется очень улучшенной и эффективной альтернативой для замены всех этих "старых" кодов WMI, которые объясняют, как контролировать диски до Интернета, но до вчерашнего дня (спасибо этот пост). Я не знаю, как использовать DeviceWatcher в проекте WinForms, но теперь я использую DeviceWatcher в проекте WinForms.
Проблема в том, что, возможно, я ошибаюсь, но я думаю, что это не то, чего я ожидал, просто я не могу найти какую-либо документацию об DeviceWatcher (только пример MSDN выше), и я не могу найти способ получить необходимую информацию для мониторинга событий накопителя, я попытался обработать все события DeviceWatcher, чтобы распечатать в консоли Debug все данные, содержащиеся в аргументах, с надеждой найти что-то, что могло бы мне помочь... но нет, я очень зациклен на использовании класса DeviceWatcher, и я не могу представить, как это сделать.
Когда я подключаю или отсоединяю USB, я просто вижу две вещи: идентификатор оборудования и свойство InterfaceEnabled (что я не знаю, определяет ли это наличие устройства), ничего интересного больше.
Что я сделал:
· Получить идентификаторы аппаратного устройства.
Что я хотел бы сделать:
. Извлеките тип устройства (в отличие от USB и других устройств), когда устройство подключено, отключено и отключено.
· Получить доступность устройства (я имею в виду, доступно ли устройство для чтения/записи данных), когда устройство подключено, отключено и отключено.
. Извлечь букву устройства, когда устройство подключено, отсоединение и отсоединение.
· Получить описание метки устройства, когда устройство подключено, отключено и отключено.
Код:
Public Class DeviceWatcher_Test
Private WithEvents dw As DeviceWatcher = DeviceInformation.CreateWatcher
' It 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