2017-10-15 154 views
1

我想在我的应用程序中检测USB驱动器是插入还是拔出。使用Windows服务和Vb.Net检测USB驱动器的插入和删除

我已经搜索了很多关于它,但实际上找到了很多答案,但没有工作正是我想要它的样子。我发现一个完美的作品,并提供消息时,驱动器插入或插入,但使用WndProc这是一个非常漫长的过程,很难明白我特别是谁对零知识,但这不是主要问题。我在WndProc创建的主要问题是它不能执行一些我想要做的功能,而WMI可以做到这些。我还发现了WMI解决方案,它可以检测驱动器时,驱动器插入当设备被拔出这是我的计划很重要的是它不能检测。我发现另一个解决方案,似乎工作,但它是在C#代码中,我试图将其转换为VB.Net,但是当我进入该C#代码的第4行代码时未能这样做(我将在后面添加该代码下面)。

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

  • WndProc - www.vbforfree.com

    检测任何驱动器插上电源,完全拔出事件。

  • WMI Solution Vb.Net - www.vb-tips.com

    完美的作品时,驱动器插好,但如果一个驱动器被拔出无法察觉。

  • WMI Solution 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(); 
+0

我注意到这个问题被张贴在覆盖旧的,理由是你已经自动被禁止的问题上。在这种情况下可以,因为你还没有收到旧问题的答案。但是请注意,总的来说,我们不鼓励这种做法 - 如果您已经收到答案,那么完全修改问题将不公平地使其他人的工作无效,并且您可以预期您的旧问题会被回滚。如果你想问新的堆栈溢出问题,我建议你不要试图解决它,而是让你的问题取消废止。 – halfer

+0

如果你想这样做,[这是关键资源](https://meta.stackoverflow.com/questions/255583/what-c​​an-i-do-when-getting-we-are-no-longer-接受 - 问题 - 答案 - 从)你需要。 – halfer

+1

谢谢。我从来没有这样做过,但这次我没有办法问,我需要帮助。无论如何,我自己不会编辑这个问题,如果它有任何答案,那看起来完全是无稽之谈。并感谢您指出我的看法。 :) –

回答

1

我找到了解决办法:)

参考。

Win32_VolumeChangeEvent class

  • 配置更改(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 
相关问题