Обнаружение вставки и извлечения 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 ответ
Я нашел решение:)
Ссылка
- Конфигурация изменена (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