2

我想在我的应用程序中检测 USB 驱动器是插入还是拔出。

我搜索了很多关于它的内容,实际上找到了很多答案,但没有一个完全符合我的要求。我发现一个可以完美运行并在插入或拔出驱动器时发出消息但使用WndProc的程序,这是一个非常长的过程,特别是对于对它的知识为零的我来说很难理解,但这不是主要问题. 我用WndProc发现的主要问题是它不能做一些我想做的功能,而WMI可以做这些。我还找到了WMI解决方案,它可以在插入驱动器时检测到驱动器,但在拔出设备时无法检测到这对我的程序非常重要。我找到了另一个似乎可行的解决方案,但它是在 C# 代码中,我试图将它转换为 VB.Net,但是当我进入该 C# 代码的代码行 4 时未能这样做(稍后我将在问题中添加以下)。

部分帮助我的解决方案的链接:

  • WndProc - www.vbforfree.com

    完美检测驱动器插入和拔出事件。

  • WMI 解决方案 Vb.Net - www.vb-tips.com

    插入驱动器但无法检测驱动器是否已拔出时可以完美运行。

  • WMI 解决方案 C# - stackoverflow.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();
4

1 回答 1

2

我找到了解决方案:)

参考。

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
于 2017-10-21T07:13:12.257 回答