Überwachen Sie USB-Laufwerke und rufen Sie Geräteinformationen mit einem DeviceWatcher ab?

Ich bin einWinForms Entwickler und ich wussten bereits, wie man die USBs überwacht, die über WMI verbunden oder getrennt werden, aber vor einiger Zeit hatte ich die entdecktDeviceWatcher Diese Klasse hat sich auf den ersten Blick für moderne Windows - Apps interessiert, denn sie scheint eine sehr verbesserte und effiziente Alternative zu sein, um all die "alten" WMI - Codes zu ersetzen, mit denen erklärt wird, wie Laufwerke über das Internet überwacht werdendieser Beitrag) Ich habe keine Ahnung, wie der DeviceWatcher in einem WinForms-Projekt verwendet wird, aber jetzt verwende ich den DeviceWatcher in einem WinForms-Projekt.

Das Problem ist, dass ich mich vielleicht irre, aber ich denke, dass dies nicht wirklich das ist, was ich erwartet habe. Ich kann nur keine Dokumentation über den DeviceWatcher finden (nur das MSDN-Beispiel oben) und den Weg dorthin nicht finden Ich habe versucht, alle Ereignisse des DeviceWatcher zu verarbeiten, um in der Debug-Konsole alle in den Argumenten enthaltenen Daten auszudrucken, in der Hoffnung, etwas zu finden, das mir helfen könnte nicht, ich bin sehr mit der Verwendung der steckenDeviceWatcher Klasse und ich können mir nicht vorstellen, wie ich vorgehen soll.

Beim Anschließen oder Trennen eines USB-Geräts werden nur zwei Dinge angezeigt: die Hardware-ID und die Eigenschaft "InterfaceEnabled" (von der ich nicht weiß, ob sie die Geräteverfügbarkeit bestimmt).

Was ich erreicht habe:

· Abrufen der Hardware-Geräte-IDs.

Was möchte ich erreichen:

· Abrufen des Gerätetyps (zur Unterscheidung zwischen USB- und anderen Gerätetypen), wenn das Gerät angeschlossen, getrennt oder getrennt ist.

· Abrufen der Geräteverfügbarkeit (ich meine, ob auf das Gerät Lese- / Schreibzugriff besteht), wenn das Gerät verbunden, getrennt und getrennt ist.

· Rufen Sie den Gerätebuchstaben ab, wenn das Gerät verbunden, getrennt und getrennt ist.

· Rufen Sie die Gerätebeschriftung ab, wenn das Gerät verbunden, getrennt und getrennt ist.

Der 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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage