So bin mal wieder an einem neuen Projekt. Habe im Sourcecodeaustausch einen Code von mikeb69 und Vatter gefunden:
[VB.NET] Erkennen, wann ein Laufwerk hinzugefügt bzw. entfernt wurde (USB-Stick)
Spoiler anzeigen
Jetzt versuche ich mir alles etwas auf meine Bedürfnisse anzupassen.
Folgendes Zenario: Form1 hat einen Button, dieser soll, solange kein USB Stick angeschlossen ist, keine Funktion und ein anderes Image als Hintergrund haben. Sobald ein USB Stick am PC hängt sollen diese Funktionen hinterlegt sein: anderes Image, Form2 öffnen und Laufwerksbuchstaben in Label ausgeben.
Das ausgeben des Laufwerksbuchstaben in ein Label hab ich gelöst, indem ich die Private Sub aus dem Beispiel umgeschrieben habe. Jetzt happert es aber am Rest. Jetzt hoffe ich wieder auf eure hilfreichen Vorschläge.
An dieser Stelle nochmal vielen Dank für den Sourcecode an mikeb69 und Vatter.
[VB.NET] Erkennen, wann ein Laufwerk hinzugefügt bzw. entfernt wurde (USB-Stick)
VB.NET-Quellcode
- Imports System.IO
- Public Class ClsDrivewatcher
- Inherits System.Windows.Forms.NativeWindow
- 'Konstanten für Windowsmessages
- Private Const WM_DEVICECHANGE As Integer = &H219
- Private Const DBT_DEVICEARRIVAL As Integer = &H8000
- Private Const DBT_DEVICEREMOVECOMPLETE As Integer = &H8004
- 'Events
- Public Event WinProc(ByVal sender As ClsDrivewatcher, ByRef m As Message)
- Public Event Drive_Neu(ByVal DI As DriveInfo)
- Public Event Drive_entfernt(ByVal DN As String)
- Private allDrives As New List(Of DriveInfo)
- Public Sub New(ByVal Handle As IntPtr)
- 'übergibt dem NativeWindow das Handle
- MyBase.AssignHandle(Handle)
- 'Listet alle Laufwerke in allDrives
- allDrives = GetAllDrives()
- End Sub
- 'Ausgabemöglichkeit für Laufwerkliste
- Public Function Getdrives() As List(Of DriveInfo)
- Return allDrives
- End Function
- 'WinProc-Methode des übergebenen Handles
- Protected Overrides Sub WndProc(ByRef msg As Message)
- 'gibt die OriginalMessage an übergebenes Handles weiter
- MyBase.WndProc(msg)
- 'Event für externe Auswertung der Message
- RaiseEvent WinProc(Me, msg)
- 'Wenn ein Laufwerk gewechselt und ein neues Laufwerk erkannt wurde
- If msg.Msg = WM_DEVICECHANGE AndAlso msg.WParam = CType(DBT_DEVICEARRIVAL, IntPtr) Then
- 'alle laufwerke durchlaufen und in der liste suchen
- For Each s As String In Directory.GetLogicalDrives
- find_driveinfo_arg = s
- Dim d As DriveInfo = allDrives.Find(AddressOf find_driveinfo)
- If d Is Nothing Then
- d = New DriveInfo(s)
- 'laufwerk wurde in der liste nicht gefunden und ist somit neu
- 'MessageBox.Show("Neuer Datenträger erkannt = " & d.Name)
- 'laufwerk jetzt zur liste hinzufügen
- allDrives.Add(d)
- 'Event auslösen
- RaiseEvent Drive_Neu(d)
- End If
- Next
- End If
- 'Wenn ein Laufwerk gewechselt und ein Laufwerk entfernt wurde
- If msg.Msg = WM_DEVICECHANGE AndAlso msg.WParam = CType(DBT_DEVICEREMOVECOMPLETE, IntPtr) Then
- 'alle laufwerke aus der liste prüfen
- Dim temp As List(Of DriveInfo) = GetAllDrives()
- For Each d As DriveInfo In allDrives
- find_driveinfo_arg = d.Name
- Dim lost As DriveInfo = temp.Find(AddressOf find_driveinfo)
- If lost Is Nothing Then
- 'laufwerk wurde in der liste nicht mehr gefunden
- 'MessageBox.Show("Datenträger wurde entfernt = " & d.Name)
- 'Event auslösen
- RaiseEvent Drive_entfernt(d.Name)
- 'laufwerk aus der liste entfernen
- allDrives.Remove(d)
- 'schleife verlassen
- Exit For
- End If
- Next
- End If
- End Sub
- 'Funktion zum Auflisten der Laufwerke
- Private Function GetAllDrives() As List(Of DriveInfo)
- Dim ret As New List(Of DriveInfo)
- 'und wieder befüllen
- For Each d As String In Directory.GetLogicalDrives
- ret.Add(New DriveInfo(d))
- Next
- Return ret
- End Function
- 'suchfunktion zum finden der laufwerke in der collection
- Private find_driveinfo_arg As String
- Private Function find_driveinfo(ByVal d As DriveInfo) As Boolean
- If d.Name = find_driveinfo_arg Then
- Return True
- Else
- Return False
- End If
- End Function
- End Class
Jetzt versuche ich mir alles etwas auf meine Bedürfnisse anzupassen.
Folgendes Zenario: Form1 hat einen Button, dieser soll, solange kein USB Stick angeschlossen ist, keine Funktion und ein anderes Image als Hintergrund haben. Sobald ein USB Stick am PC hängt sollen diese Funktionen hinterlegt sein: anderes Image, Form2 öffnen und Laufwerksbuchstaben in Label ausgeben.
Das ausgeben des Laufwerksbuchstaben in ein Label hab ich gelöst, indem ich die Private Sub aus dem Beispiel umgeschrieben habe. Jetzt happert es aber am Rest. Jetzt hoffe ich wieder auf eure hilfreichen Vorschläge.
An dieser Stelle nochmal vielen Dank für den Sourcecode an mikeb69 und Vatter.