Обнаружение вставки и извлечения USB-накопителя с помощью службы Windows и Vb.Net

Я хочу в своем приложении определить, подключен ли USB-накопитель или нет.

Я много гуглил по этому поводу и на самом деле нашел много ответов, но ни один из них не работал так, как я хотел. Я нашел тот, который отлично работает и выдает сообщение, когда диск подключен или отключен, но использует WndProc, который является очень длительной процедурой и которую очень трудно понять специально для меня, кто об этом не знает, но это не главная проблема, Основная проблема, которую я обнаружил с WndProc, заключается в том, что он не может выполнять некоторые функции, которые я хочу выполнять, тогда как WMI может выполнять их. Я также нашел решение WMI, которое может обнаружить диск, когда диск подключен, но не может обнаружить, когда устройство подключено, что очень важно для моей программы. Я нашел другое решение, которое, кажется, работает, но оно в коде C#, и я попытался преобразовать его в VB.Net, но не смог сделать это, когда я вошел в строку кода 4 этого кода C# (который я добавлю позже в вопросе ниже).

Ссылки на решения, которые помогли мне частично:

  • WndProc - www.vbforfree.com

    Обнаруживает, что накопитель подключен и отключен.

  • Решение WMI Vb.Net - www.vb-tips.com

    Прекрасно работает, когда диск подключен, но не может определить, отключен ли диск.

  • Решение WMI C# - stackru.com

    Кажется, работает, но не удалось преобразовать его в Vb.Net

Код C#, который, я думаю, может работать:

using System.Management;

ManagementEventWatcher watcher = new ManagementEventWatcher();
WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2");
//I am stuck from the line below this
watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
watcher.Query = query;
watcher.Start();
watcher.WaitForNextEvent();

1 ответ

Решение

Я нашел решение:)

Ссылка

Класс Win32_VolumeChangeEvent

  • Конфигурация изменена (1)
  • Прибытие устройства (2)
  • Удаление устройства (3)
  • Стыковка (4)

Код:

Imports System.Management
Imports Microsoft.Win32

Public Class Form1
    Dim WithEvents pluggedInWatcher As ManagementEventWatcher
    Dim WithEvents pluggedOutWatcher As ManagementEventWatcher
    Dim pluggedInQuery As WqlEventQuery
    Dim pluggedOutQuery As WqlEventQuery

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Try
            pluggedInQuery = New WqlEventQuery
            pluggedInQuery.QueryString = "SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2"
            pluggedInWatcher = New ManagementEventWatcher(pluggedInQuery)
            pluggedInWatcher.Start()

            pluggedOutQuery = New WqlEventQuery
            pluggedOutQuery.QueryString = "SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 3"
            pluggedOutWatcher = New ManagementEventWatcher(pluggedOutQuery)
            pluggedOutWatcher.Start()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    Private Sub pluggedInWatcher_EventArrived(sender As Object, e As EventArrivedEventArgs) Handles pluggedInWatcher.EventArrived
        MsgBox("Plugged In")
    End Sub

    Private Sub pluggedOutWatcher_EventArrived(sender As Object, e As EventArrivedEventArgs) Handles pluggedOutWatcher.EventArrived
        MsgBox("Plugged Out")
    End Sub
End Class
Другие вопросы по тегам