2011-02-06 2 views
1

Вместо класса FileSystemWachter Я смотрю что-то похожее, которое выглядит, когда появляется новая буква диска. Например, когда вставлен USB-диск или вставлена ​​SD-карта и т. Д., Вы получите новую букву диска. Я хотел бы иметь событие в моем приложении, когда это происходит.Диспетчер писем для писем

Можете ли вы использовать класс FileSystemWatcher для этого или есть что-то конкретное для этого?

Любые примеры или предложения?

+0

Как быстро вы хотите, чтобы ваше приложение отвечало на него? –

+0

Как можно быстрее :) – Marcel

ответ

5

Попробуйте это: http://www.dotnetthoughts.net/2009/02/13/how-to-detect-usb-insertion-and-removal-in-vbnet/

Private WM_DEVICECHANGE As Integer = &H219 

Public Enum WM_DEVICECHANGE_WPPARAMS As Integer 
    DBT_CONFIGCHANGECANCELED = &H19 
    DBT_CONFIGCHANGED = &H18 
    DBT_CUSTOMEVENT = &H8006 
    DBT_DEVICEARRIVAL = &H8000 
    DBT_DEVICEQUERYREMOVE = &H8001 
    DBT_DEVICEQUERYREMOVEFAILED = &H8002 
    DBT_DEVICEREMOVECOMPLETE = &H8004 
    DBT_DEVICEREMOVEPENDING = &H8003 
    DBT_DEVICETYPESPECIFIC = &H8005 
    DBT_DEVNODES_CHANGED = &H7 
    DBT_QUERYCHANGECONFIG = &H17 
    DBT_USERDEFINED = &HFFFF 
End Enum 

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 
    If m.Msg = WM_DEVICECHANGE Then 
     Select Case m.WParam 
      Case WM_DEVICECHANGE_WPPARAMS.DBT_DEVICEARRIVAL 
       lblMessage.Text = "USB Inserted" 
      Case WM_DEVICECHANGE_WPPARAMS.DBT_DEVICEREMOVECOMPLETE 
       lblMessage.Text = "USB Removed" 
     End Select 
    End If 
    MyBase.WndProc(m) 
End Sub 
+0

Я видел это, но не знаю, какая буква диска добавлена. Я только сейчас, когда вставлено USB-устройство. – Marcel

+0

Когда WM_DEVICECHANGE имеет тип DBT_DEVICEARRIVAL, он также будет содержать объект lParam, который должен содержать структуру, которая получает информацию об устройстве. Он будет находиться в структуре DEV_BROADCAST_HDR. Если вы завернете это в VB, вы сможете указать устройство. http://msdn.microsoft.com/en-us/library/aa363246(v=vs.85).aspx –

0

Одним из решений может быть WMI, особенно

Computer System Hardware Classes

+0

Недостатком WMI будет тот факт, что вы постоянно должны запрашивать его для проверки изменений; Кроме того, WMI не так быстро. – alex

0

Вот решение с помощью таймера. Это не относится к устройствам USB-типа.

Dim WithEvents myTimer As New Timers.Timer 
Private Sub Form1_Shown(ByVal sender As Object, _ 
         ByVal e As System.EventArgs) Handles Me.Shown 

    'start a timer to watch for new drives 
    myTimer.Interval = 1000 
    myTimer.AutoReset = True 
    myTimer.Start() 
    drvs.AddRange(IO.Directory.GetLogicalDrives) 'get initial set of drives 

End Sub 

Dim drvs As New List(Of String) 
Private Sub myTimer_Elapsed(ByVal sender As Object, _ 
          ByVal e As System.Timers.ElapsedEventArgs) Handles myTimer.Elapsed 

    Dim cDrvs As New List(Of String)(IO.Directory.GetLogicalDrives) 'get current drives 
    Dim eDrvs As IEnumerable(Of String) 
    Dim add_or_remove As Integer = 0 '0 = same number, 1 = removed, 2 = add 

    If cDrvs.Count = drvs.Count Then 
     'same number of drives - check that they are the same 
     eDrvs = drvs.Except(cDrvs) 
    ElseIf cDrvs.Count < drvs.Count Then 
     'drive(s) removed 
     eDrvs = drvs.Except(cDrvs) 
     add_or_remove = 1 
     Debug.WriteLine("R") 
    ElseIf cDrvs.Count > drvs.Count Then 
     'new drive(s) 
     eDrvs = cDrvs.Except(drvs) 
     add_or_remove = 2 
     Debug.WriteLine("A") 
    End If 

    For Each d As String In eDrvs 
     Debug.WriteLine(d) 

    Next 
    drvs = cDrvs 'set list of current drives 
End Sub 
+0

Спасибо, Это Улыбка! – Marcel

Смежные вопросы