Einstecken von SD Karte erkennen Nicht USB Stick

  • VB.NET
  • .NET 4.0

Es gibt 65 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Einstecken von SD Karte erkennen Nicht USB Stick

    Hallo

    Also ich habe viel gesucht und bin nicht fündig geworden ( außer C# was ich überhaupt nicht kann )
    Folgendes Problem.
    Ich habe einen USB SD-Kartenleser und möchte nun erreichen das erkannt wird wenn die KARTE in den Reader gesteckt wird.
    Das erkennen des Readers bein abziehen und einstecken habe ich...( hier schon gefunden von @RodFromGermany )

    Ich hatte noch ein Code im Web gefunden der mit WMIWIN32 ... aber das hat alles nichts gebracht.

    Das war hier schonmal ein Thema aber dort wird dann wieder nur auf C# verwiesen ;(
    C# und VB.NET verwenden exakt dieselben Klassen. Ledigilich die Syntax ist etwas anders. Wenn man mal die geschweiften Klammern ignoriert, und sich merkt, dass Dim a as String = "tadaa!" in C# string a = "tadaa!" ist, sind die unterschiede nicht mehr groß. Klar, es gibt es noch die Eventdeklarationen, anonyme Methoden, die sich anders Schreiben und den unsafe "Bereich", der in VB.NET komplett fehlt, jedoch lässt sich bereits mit sehr wenig C# Syntax kenntnis sehr viel C# Code lesen, wenn man denn VB.NET beherrscht.

    Zeig doch mal, was du so in C# gefunden hast, vielleicht kann dir dann jemand hier in VB.NET weiterhelfen.
    SIMDoku (Simple Dokumentenverwaltung)
    Mein Lernprojekt um die verschiedensten Facetten der .NET Entwicklung zu erkunden.
    GitHub

    VB Paradise Dark Theme
    Inoffizieller VB-Paradise Discord.
    Der Link wurde hier schonmal gepostet.
    tempuzfugit.wordpress.com/2007…net-usb-card-readers-etc/

    @EaranMaleasi
    VB.Net beherschen ... hihi ... ich bin Anfängerin ;)

    EDIT: Das hier hatte ich auch gefunden was aber nicht läuft.

    VB.NET-Quellcode

    1. ​Public Class Form1
    2. Dim SDCard As Win32.DiskDrive
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Dim strTestText As String
    5. For Each di As IO.DriveInfo In IO.DriveInfo.GetDrives
    6. If di.DriveType = IO.DriveType.Removable Then
    7. If di.IsReady = True Then
    8. lstSDInfo.Items.Add("SD Card Found")
    9. lstSDInfo.Items.Add("Drive Letter: " + di.Name)
    10. lstSDInfo.Items.Add("Drive Format: " + di.DriveFormat)
    11. lstSDInfo.Items.Add(" ")
    12. End If
    13. End If
    14. Next
    15. For Each SD As Win32.DiskDrive In SDCard.GetInstances
    16. strTestText = SD.Caption.ToString
    17. If InStr(strTestText, "SD", CompareMethod.Binary) = False Then
    18. Else
    19. lstSDInfo.Items.Add("SD Card Reader Found: " + strTestText)
    20. lstSDInfo.Items.Add("Card Reader Empty: " + (SD.IsSizeNull.ToString))
    21. End If
    22. Next
    23. End Sub
    24. End Class
    @Amelie Es gibt Code-Konverter zwischen C# und VB.NET.
    Einen davon findest Du in meiner Signatur.
    ====
    Wenn der Übersetzer Mist baut, dann frag danach. Poste dann den Original-Code und den übersetzten Code.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Class SurroundingClass
    3. <StructLayout(LayoutKind.Sequential)>
    4. Public Structure DEV_BROADCAST_VOLUME
    5. Public dbcv_size As Integer
    6. Public dbcv_devicetype As Integer
    7. Public dbcv_reserved As Integer
    8. Public dbcv_unitmask As Integer
    9. End Structure
    10. Protected Overrides Sub WndProc(ByRef m As Message)
    11. Const WM_DEVICECHANGE As Integer = &H0219
    12. Const DBT_DEVICEARRIVAL As Integer = &H8000
    13. Const DBT_DEVICEQUERYREMOVE As Integer = &H8001
    14. Const DBT_DEVICEQUERYREMOVEFAILED As Integer = &H8002
    15. Const DBT_DEVICEREMOVEPENDING As Integer = &H8003
    16. Const DBT_DEVICEREMOVECOMPLETE As Integer = &H8004
    17. Const DBT_DEVTYP_VOLUME As Integer = &H00000002
    18. Select Case m.Msg
    19. Case WM_DEVICECHANGE
    20. Select Case m.WParam.ToInt32()
    21. Case DBT_DEVICEARRIVAL
    22. Dim devType As Integer = Marshal.ReadInt32(m.LParam, 4)
    23. If devType = DBT_DEVTYP_VOLUME Then
    24. Dim vol As DEV_BROADCAST_VOLUME
    25. vol = CType(Marshal.PtrToStructure(m.LParam, GetType(DEV_BROADCAST_VOLUME)), DEV_BROADCAST_VOLUME)
    26. MessageBox.Show(A, storage, device, has, been, inserted, unit:=_, +UnitName(vol.dbcv_unitmask))
    27. End If
    28. Case DBT_DEVICEREMOVECOMPLETE
    29. MessageBox.Show(Device, removed, From _ In _ Select _)
    30. End Select
    31. End Select
    32. MyBase.WndProc(m)
    33. End Sub
    34. Private Function UnitName(ByVal unitmask As Integer) As Char
    35. Dim units As Char() = {A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z}
    36. Dim i As Integer = 0
    37. Dim ba As System.Collections.BitArray = New System.Collections.BitArray(System.BitConverter.GetBytes(unitmask))
    38. For Each var As Boolean In ba
    39. If var = True Then Exit For
    40. i += 1
    41. Next
    42. Return units(i)
    43. End Function
    44. End Class


    Weiß nicht ob es geht, der Klassenname ist generiert und die Bemerkungen hatte ich rausgenommen.
    Soviel es mir recht ist, sollte das auch mit WMI Win32_PnPEntity funktionieren.

    Habe es jetzt nicht getestet, aber der Aufruf ist sehr einfach.
    new ManagementObjectSearcher("Select * From Win32_PnPEntity")

    Die Properties müsste ich jetzt auch suchen, weiss sie leider nicht.
    Eventuell DeviceID

    EDIT: Hab was gefnden, eventuell funkst auch das hier:
    qastack.com.de/programming/333…-of-connected-usb-devices

    Ich nehme an, IO.DriveInfo.GetDrives hast schon ausprobiert.


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    @Amelie Bitte verweise auf den Code, den Du verwendet hast.
    Ein neues Projekt mit Button und MultiLile-Textbox, getestet:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Button und Multiline-TextBox
    2. Imports System.IO
    3. Public Class Form1
    4. ''' <summary>
    5. ''' Liste der aktuell vorhandenen Laufwerke
    6. ''' </summary>
    7. ''' <remarks></remarks>
    8. Private allDrives As New List(Of DriveInfo)
    9. Private DriveNameToFind As String
    10. Public Sub New()
    11. Me.InitializeComponent()
    12. Me.allDrives = DriveInfo.GetDrives().ToList()
    13. End Sub
    14. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    15. Me.TextBox1.Clear()
    16. End Sub
    17. Protected Overloads Overrides Sub WndProc(ByRef msg As Message)
    18. MyBase.WndProc(msg)
    19. Const WM_DEVICECHANGE As Integer = &H219
    20. Const DBT_DEVICEARRIVAL As Integer = &H8000
    21. Const DBT_DEVICEREMOVECOMPLETE As Integer = &H8004
    22. Const DBT_DEVNODES_CHANGED As Integer = 7
    23. Dim wParam As Integer = msg.WParam.ToInt32()
    24. If msg.Msg = WM_DEVICECHANGE Then
    25. If wParam = DBT_DEVICEARRIVAL Then
    26. 'Laufwerke suchen
    27. For Each drive As String In Directory.GetLogicalDrives
    28. Me.DriveNameToFind = drive
    29. Dim found As DriveInfo = Me.allDrives.Find(AddressOf find_driveinfo)
    30. If found Is Nothing Then
    31. 'Me.TextBox1.AppendText("Ein USB-Gerät wurde hinzugefügt." & Environment.NewLine)
    32. Me.TextBox1.AppendText(String.Format("Ein USB-Gerät wurde hinzugefügt: {0}{1}", drive, Environment.NewLine))
    33. 'Laufwerk ist neu, Laufwerk zu "bereits vorhanden" hinzufügen
    34. Me.allDrives.Add(New DriveInfo(drive))
    35. End If
    36. Next
    37. ElseIf wParam = DBT_DEVICEREMOVECOMPLETE Then
    38. ' alle Laufwerke aus der Liste prüfen
    39. Dim temp As List(Of DriveInfo) = DriveInfo.GetDrives().ToList()
    40. For Each drive As DriveInfo In Me.allDrives
    41. Me.DriveNameToFind = drive.Name
    42. Dim lost As DriveInfo = temp.Find(AddressOf find_driveinfo)
    43. If lost Is Nothing Then
    44. Me.TextBox1.AppendText(String.Format("Ein USB-Gerät wurde entfernt: {0}{1}", drive.Name, Environment.NewLine))
    45. 'Laufwerk wird in der Liste nicht mehr gefunden: Laufwerk aus der Liste löschen
    46. Me.allDrives.Remove(drive)
    47. Exit For
    48. End If
    49. Next
    50. ElseIf wParam = DBT_DEVNODES_CHANGED Then
    51. Me.TextBox1.AppendText("Ein USB-Gerät wurde gesteckt / entfernt." & Environment.NewLine)
    52. End If
    53. End If
    54. End Sub
    55. ' Suchfunktion für die Liste, da eine Property verglichen wird
    56. Private Function find_driveinfo(ByVal drive As DriveInfo) As Boolean
    57. Return drive.Name = Me.DriveNameToFind
    58. End Function
    59. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Welcher Konverter war das denn?

    VB.NET-Quellcode

    1. Dim units As Char() = {A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z}

    @Amelie schreib das als Char!

    VB.NET-Quellcode

    1. Dim units As Char() = {"A"c, "B"c, "C"c, "D"c, "E"c, "F"c, "G"c, "H"c, "I"c, "J"c, "K"c, "L"c, "M"c, "N"c, "O"c, "P"c, "Q"c, "R"c, "S"c, "T"c, "U"c, "V"c, "W"c, "X"c, "Y"c, "Z"c}


    Und die MessageBox erwartet auch einen String

    VB.NET-Quellcode

    1. MessageBox.Show("A storage device has been inserted")


    Sollen das absichtlich eingebaute Copy-Paste-Fehler sein? Ich meine, das kann doch gar nicht kompiliert haben?!
    Hi

    Hier geht es zwar um "USB-Wechselmedien" wie USB-Sticks und USB-Festplatten, aber ich denke mit ein wenig umbauen sollte das einstecken/entfernen einer SD-Karte auch erkannt werden. Vllt hilft es ja: Hinzufügen und Entfernen von USB-Wechselmedien erkennen
    Mfg -Franky-
    @RodFromGermany @Bartosz @Dksksm

    Habe beide Versionen zum laufen gebracht. USB Geräte werden erkannt aber ...

    mit dem SD-Karten-Reader nur wenn ich den ganzen Reader abziehen und wieder einstecke.
    Ziehe ich nur die SD-Karte aus dem Reader tut sich nichts.


    In der Version von @Dksksm ist diese Funktion nicht relevnt, das funktioniert auch so.

    VB.NET-Quellcode

    1. Private Function UnitName(ByVal unitmask As Integer) As Char
    2. Dim units As Char() = {"A"c, "B"c, "C"c, "D"c, "E"c, "F"c, "G"c, "H"c, "I"c, "J"c, "K"c, "L"c, "M"c, "N"c, "O"c, "P"c, "Q"c, "R"c, "S"c, "T"c, "U"c, "V"c, "W"c, "X"c, "Y"c, "Z"c}
    3. Dim i As Integer = 0
    4. Dim ba As System.Collections.BitArray = New System.Collections.BitArray(System.BitConverter.GetBytes(unitmask))
    5. For Each var As Boolean In ba
    6. If var = True Then Exit For
    7. i += 1
    8. Next
    9. Return units(i)
    10. End Function


    Hier kommt die Meldung: Nicht verwendete lokale Konstante. Nimmt man diese raus funktioniert das auch noch.

    VB.NET-Quellcode

    1. Const DBT_DEVICEQUERYREMOVE As Integer = &H8001
    2. Const DBT_DEVICEQUERYREMOVEFAILED As Integer = &H8002
    3. Const DBT_DEVICEREMOVEPENDING As Integer = &H8003

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Amelie“ ()

    @Amelie Ja, es ist wohl so.
    Allerdings bekomme ich, wenn ich die SD-Karte über "Hardware sicher entferenen ..." in der Taskbar auswerfe, eine Meldung.
    Möglicherweise fangen wir nicht die richtigen Messages ab.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Wenn ich das über die Taskbar mache zeigt der Code die selbe Meldung.
    In der Taskbar wird aber auch der Name der SD-Karte mit angezeigt, in dem Code halt nur der Reader mit dem LW-Buchstaben.

    Nochmal zur Info, falls das wichtig ist. Ich nutze Win 7 64 Bit

    Amelie schrieb:

    in dem Code halt nur der Reader mit dem LW-Buchstaben.
    Na klar, da wird ja auch nix weiter angezeigt.
    Beim Stecken kannst Du den .VolumeLabel vom gesteckten Laufwerk anzeigen.
    Wenn Du das auch beim Abziehen haben willst, musst Du Dir die .VolumeLabel von allen Laufwerken merken,
    denn das gezogene Laufwerk hat kein .VolumeLabel mehr.

    VB.NET-Quellcode

    1. If found Is Nothing Then
    2. found = New DriveInfo(drive)
    3. Me.TextBox1.AppendText(String.Format("Ein USB-Gerät wurde hinzugefügt: {0}{1}", found.VolumeLabel, Environment.NewLine))
    4. 'Laufwerk ist neu, Laufwerk zu "bereits vorhanden" hinzufügen
    5. Me.allDrives.Add(found)
    6. End If
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Das war mir schon klar. Vielleicht habe ich mich falsch ausgedrückt.
    Aber ich habe etwas festgestellt.

    Der Windows-Explorer macht das gleiche.
    Stecke ich den leeren CardReader ein wird der als " Wechselmedium " angezeigt. Stecke ich nun die SD-Karte in den Reader passiert NICHTS!! Ich muss erst den Explorer aktualisieren. Beim rausziehen der Karte das gleiche, ich muss erst aktualisieren!

    Stecke ich jedoch den Reader mit der SD-Karte ein, zeigt der Explorer gleich den Namen der SD-Karte an!

    Amelie schrieb:

    den Namen der SD-Karte
    oder den Laufwerksbuchstaben.
    Das war der Unterschied.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi

    Per API SHChangeNotifyRegister kommst Du an entsprechende Messages wenn Du folgende Flags zur Überwachung verwendest: SHCNE_MEDIAINSERTED, SHCNE_MEDIAREMOVED. Schaut dann, in meinem VB6 Testcode, so aus:

    Laufwerk G ist bei mir ein CardReader. Wenn entsprechende Messages erkannt wurden, müsstest noch prüfen ob das erkannte Laufwerk ein Removable-Device ist.
    Bilder
    • SHChangeNotifyRegister.jpg

      48,62 kB, 760×166, 96 mal angesehen
    Mfg -Franky-