Einstecken von SD Karte erkennen Nicht USB Stick

  • VB.NET
  • .NET (FX) 4.0

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

    @RodFromGermany
    Ich hatte nichts geändert nur das was hier in den Beiträgen genannt wurde.

    Das habe ich nun nochmals getestet.
    1.) Versuch. Fehler wie beim ersten mal. Neu kompiliert.
    2.) Versuch. Starte Fenster geht auf. stecke den Cardreader mit SD-Karte ein. NIX passiert.
    3.) Versuch. SDReader eingesteckt. Starte den Code Fehler wie beim ersten mal. Wieder neu kompiliert. Das selbe von vorne. Startet ohne Fehler. stecke die SD-Card ein ... Nix passiert.
    4.) Versuch Nix eingesteckt Programm startet ohne Fehler. normalen USB Stick rein.. nix passiert....

    MAl eine dumme Frage: wo soll das denn angezeigt werden?
    Select Case intEvent
    Case SHCNE_MEDIAINSERTED
    strRet = "MEDIA INSERTED"
    ....
    Spoiler anzeigen


    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. Private Const S_OK As Integer = &H0
    4. Private Const WM_DESTROY As Integer = &H2
    5. Private Const WM_SHNOTIFY As Integer = &H488
    6. Private Const CSIDL_DESKTOP As Integer = &H0
    7. Private Const GPFIDL_DEFAULT As Integer = &H0
    8. Private Const SHCNE_MEDIAREMOVED As Integer = &H40
    9. Private Const SHCNE_MEDIAINSERTED As Integer = &H20
    10. Private Enum SHCNRF As Integer
    11. SHCNRF_InterruptLevel = &H1
    12. SHCNRF_ShellLevel = &H2
    13. SHCNRF_RecursiveInterrupt = &H1000
    14. SHCNRF_NewDelivery = &H8000
    15. End Enum
    16. <StructLayout(LayoutKind.Sequential)>
    17. Private Structure SHChangeNotifyEntry
    18. Dim pidl As IntPtr
    19. <MarshalAs(UnmanagedType.Bool)> Dim fRecursive As Boolean
    20. End Structure
    21. <StructLayout(LayoutKind.Sequential)>
    22. Private Structure SHNOTIFYSTRUCT
    23. Dim dwItem1 As IntPtr
    24. Dim dwItem2 As IntPtr
    25. End Structure
    26. <DllImport("ole32.dll", EntryPoint:="CoTaskMemFree")>
    27. Private Shared Sub CoTaskMemFree(
    28. <[In]> ByVal hMem As IntPtr)
    29. End Sub
    30. <DllImport("shell32.dll", EntryPoint:="SHChangeNotifyRegister")>
    31. Private Shared Function SHChangeNotifyRegister(
    32. <[In]> ByVal hWnd As IntPtr,
    33. <[In]> ByVal fSources As SHCNRF,
    34. <[In]> ByVal fEvents As Integer,
    35. <[In]> ByVal wMsg As Integer,
    36. <[In]> ByVal cEntries As Integer,
    37. <[In]> ByRef lpps As SHChangeNotifyEntry) As Integer
    38. End Function
    39. <DllImport("shell32.dll", EntryPoint:="SHChangeNotifyDeregister")>
    40. Private Shared Function SHChangeNotifyDeregister(
    41. <[In]> ByVal hNotify As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
    42. End Function
    43. <DllImport("shell32.dll", EntryPoint:="SHGetFolderLocation")>
    44. Private Shared Function SHGetFolderLocation(
    45. <[In]> ByVal hwndOwner As IntPtr,
    46. <[In]> ByVal nFolder As Integer,
    47. <[In]> ByVal hToken As IntPtr,
    48. <[In]> ByVal dwReserved As Integer,
    49. <Out> ByRef pidl As IntPtr) As Integer
    50. End Function
    51. <DllImport("shell32.dll", EntryPoint:="SHChangeNotification_Lock")>
    52. Private Shared Function SHChangeNotification_Lock(
    53. <[In]> ByVal hChange As IntPtr,
    54. <[In]> ByVal dwProcId As Integer,
    55. <Out> ByRef ppidl As IntPtr,
    56. <Out> ByRef plEvent As Integer) As IntPtr
    57. End Function
    58. <DllImport("shell32.dll", EntryPoint:="SHChangeNotification_Unlock")>
    59. Private Shared Function SHChangeNotification_Unlock(
    60. <[In]> ByVal hLock As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    61. End Function
    62. <DllImport("shell32.dll", EntryPoint:="SHGetPathFromIDListEx")>
    63. Private Shared Function SHGetPathFromIDListEx(
    64. <[In]> ByVal pidl As IntPtr,
    65. <[In]> <MarshalAs(UnmanagedType.LPWStr)> ByVal pszPath As String,
    66. <[In]> ByVal cchPath As Integer,
    67. <[In]> ByVal uOpts As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
    68. End Function
    69. Private m_hSHNotify As Integer = 0
    70. Private m_hNotifyLock As IntPtr = IntPtr.Zero
    71. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    72. m_hSHNotify = RegisterNotify()
    73. End Sub
    74. Protected Overrides Sub WndProc(ByRef m As Message)
    75. Select Case m.Msg
    76. Case WM_SHNOTIFY
    77. ProcessShellNotify(m)
    78. Case WM_DESTROY
    79. UnregisterNotify()
    80. End Select
    81. MyBase.WndProc(m)
    82. End Sub
    83. Private Function RegisterNotify() As Integer
    84. Dim hSHNotify As Integer = 0
    85. Dim pPIDL As IntPtr = IntPtr.Zero
    86. Dim tSHCNE As SHChangeNotifyEntry = New SHChangeNotifyEntry
    87. If SHGetFolderLocation(IntPtr.Zero, CSIDL_DESKTOP,
    88. IntPtr.Zero, 0, pPIDL) = S_OK Then
    89. With tSHCNE
    90. .pidl = pPIDL
    91. .fRecursive = True
    92. End With
    93. hSHNotify = SHChangeNotifyRegister(Me.Handle,
    94. SHCNRF.SHCNRF_ShellLevel Or
    95. SHCNRF.SHCNRF_InterruptLevel Or
    96. SHCNRF.SHCNRF_RecursiveInterrupt Or
    97. SHCNRF.SHCNRF_NewDelivery,
    98. SHCNE_MEDIAINSERTED Or
    99. SHCNE_MEDIAREMOVED,
    100. WM_SHNOTIFY, 1, tSHCNE)
    101. Marshal.FreeCoTaskMem(pPIDL) ' <- erst nach SHChangeNotifyRegister freigeben
    102. 'CoTaskMemFree(pPIDL) ' <- API CoTaskMemFree durch Marshal.FreeCoTaskMem ersetzt.
    103. End If
    104. Return hSHNotify
    105. End Function
    106. Private Sub UnregisterNotify()
    107. If m_hSHNotify <> 0 Then
    108. If SHChangeNotifyDeregister(m_hSHNotify) = True Then
    109. m_hSHNotify = 0
    110. End If
    111. End If
    112. End Sub
    113. Private Shared Sub ShellNotifyEvent(ByVal intEvent As Integer,
    114. ByVal tSHNS As SHNOTIFYSTRUCT)
    115. Dim strNullChar As Char = Convert.ToChar(0)
    116. Dim strPath1 As String = New String(strNullChar, 255)
    117. Dim strPath2 As String = New String(strNullChar, 255)
    118. If tSHNS.dwItem1 <> IntPtr.Zero Then
    119. If SHGetPathFromIDListEx(tSHNS.dwItem1, strPath1,
    120. strPath1.Length, GPFIDL_DEFAULT) = True Then
    121. strPath1 = strPath1.Substring(0, strPath1.IndexOf(strNullChar))
    122. Debug.Print(strPath1 & " " & LookUpSHCNE(intEvent))
    123. End If
    124. End If
    125. If tSHNS.dwItem2 <> IntPtr.Zero Then
    126. If SHGetPathFromIDListEx(tSHNS.dwItem2, strPath2,
    127. strPath2.Length, GPFIDL_DEFAULT) = True Then
    128. strPath2 = strPath2.Substring(0, strPath2.IndexOf(strNullChar))
    129. Debug.Print(strPath2 & " " & LookUpSHCNE(intEvent))
    130. End If
    131. End If
    132. End Sub
    133. Private Sub ProcessShellNotify(ByVal m As Message)
    134. Dim intEvent As Integer = 0
    135. Dim pPIDL As IntPtr = IntPtr.Zero
    136. If m_hNotifyLock = IntPtr.Zero Then
    137. m_hNotifyLock = SHChangeNotification_Lock(m.WParam, m.LParam.ToInt32,
    138. pPIDL, intEvent)
    139. If m_hNotifyLock <> IntPtr.Zero Then
    140. Dim tSHNS As SHNOTIFYSTRUCT = CType(Marshal.PtrToStructure(pPIDL,
    141. GetType(SHNOTIFYSTRUCT)), SHNOTIFYSTRUCT)
    142. If SHChangeNotification_Unlock(m_hNotifyLock) = True Then
    143. m_hNotifyLock = IntPtr.Zero
    144. End If
    145. ShellNotifyEvent(intEvent, tSHNS)
    146. End If
    147. End If
    148. End Sub
    149. Private Shared Function LookUpSHCNE(ByVal intEvent As Integer) As String
    150. Dim strRet As String = String.Empty
    151. Select Case intEvent
    152. Case SHCNE_MEDIAINSERTED
    153. strRet = "MEDIA INSERTED"
    154. Case SHCNE_MEDIAREMOVED
    155. strRet = "MEDIA REMOVED"
    156. End Select
    157. Return strRet
    158. End Function
    159. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    wo soll das denn angezeigt werden?
    Im Ausgabefenster des Studios.
    =====
    @Amelie Wenn Du den Code von @-Franky- verwendest und noch weitere Events abfangen möchtest, ist es sinnvoll notwendig, die Integer-Konstanten als Enum aufzulisten, die gibt es bei PInvoke:
    pinvoke.net/default.aspx/Enums/SHChangeNotifyEventID.html
    Ich empfehle dringend, ihnen das Attribut <Flags> zu geben.
    Dann muss zunächst überall der Parametertyp von Integer nach SHChangeNotifyEventID geändert werden und dann los.
    Testweise wollen wir dann alle Events abfangen und die in einer ListBox anzeigen statt im Ausgabefenster.
    Raus kommt dies, Form mit Button und ListBox:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form2
    3. Private Const S_OK As Integer = &H0
    4. Private Const WM_DESTROY As Integer = &H2
    5. Private Const WM_SHNOTIFY As Integer = &H488
    6. Private Const CSIDL_DESKTOP As Integer = &H0
    7. Private Const GPFIDL_DEFAULT As Integer = &H0
    8. 'Private Const SHCNE_MEDIAREMOVED As Integer = &H40
    9. 'Private Const SHCNE_MEDIAINSERTED As Integer = &H20
    10. <Flags>
    11. Enum SHChangeNotifyEventID As UInteger
    12. SHCNE_ALLEVENTS = &H7FFFFFFFL
    13. SHCNE_ASSOCCHANGED = &H8000000L
    14. SHCNE_ATTRIBUTES = &H800L
    15. SHCNE_CREATE = &H2L
    16. SHCNE_DELETE = &H4L
    17. SHCNE_DISKEVENTS = &H2381FL
    18. SHCNE_DRIVEADD = &H100L
    19. SHCNE_DRIVEADDGUI = &H10000L
    20. SHCNE_DRIVEREMOVED = &H80L
    21. SHCNE_EXTENDED_EVENT = &H4000000L
    22. SHCNE_FREESPACE = &H40000L
    23. SHCNE_GLOBALEVENTS = &HC0581E0L
    24. SHCNE_INTERRUPT = &H80000000L
    25. SHCNE_MEDIAINSERTED = &H20L
    26. SHCNE_MEDIAREMOVED = &H40L
    27. SHCNE_MKDIR = &H8L
    28. SHCNE_NETSHARE = &H200L
    29. SHCNE_NETUNSHARE = &H400L
    30. SHCNE_RENAMEFOLDER = &H20000L
    31. SHCNE_RENAMEITEM = &H1L
    32. SHCNE_RMDIR = &H10L
    33. SHCNE_SERVERDISCONNECT = &H4000L
    34. SHCNE_UPDATEDIR = &H1000L
    35. SHCNE_UPDATEIMAGE = &H8000L
    36. SHCNE_UPDATEITEM = &H2000L
    37. End Enum
    38. Private Enum SHCNRF As Integer
    39. SHCNRF_InterruptLevel = &H1
    40. SHCNRF_ShellLevel = &H2
    41. SHCNRF_RecursiveInterrupt = &H1000
    42. SHCNRF_NewDelivery = &H8000
    43. End Enum
    44. <StructLayout(LayoutKind.Sequential)>
    45. Private Structure SHChangeNotifyEntry
    46. Dim pidl As IntPtr
    47. <MarshalAs(UnmanagedType.Bool)> Dim fRecursive As Boolean
    48. End Structure
    49. <StructLayout(LayoutKind.Sequential)>
    50. Private Structure SHNOTIFYSTRUCT
    51. Dim dwItem1 As IntPtr
    52. Dim dwItem2 As IntPtr
    53. End Structure
    54. <DllImport("ole32.dll", EntryPoint:="CoTaskMemFree")>
    55. Private Shared Sub CoTaskMemFree(<[In]> ByVal hMem As IntPtr)
    56. End Sub
    57. <DllImport("shell32.dll", EntryPoint:="SHChangeNotifyRegister")>
    58. Private Shared Function SHChangeNotifyRegister(
    59. <[In]> ByVal hWnd As IntPtr,
    60. <[In]> ByVal fSources As SHCNRF,
    61. <[In]> ByVal fEvents As SHChangeNotifyEventID,'Integer,
    62. <[In]> ByVal wMsg As Integer,
    63. <[In]> ByVal cEntries As Integer,
    64. <[In]> ByRef lpps As SHChangeNotifyEntry) As Integer
    65. End Function
    66. <DllImport("shell32.dll", EntryPoint:="SHChangeNotifyDeregister")>
    67. Private Shared Function SHChangeNotifyDeregister(<[In]> ByVal hNotify As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
    68. End Function
    69. <DllImport("shell32.dll", EntryPoint:="SHGetFolderLocation")>
    70. Private Shared Function SHGetFolderLocation(
    71. <[In]> ByVal hwndOwner As IntPtr,
    72. <[In]> ByVal nFolder As Integer,
    73. <[In]> ByVal hToken As IntPtr,
    74. <[In]> ByVal dwReserved As Integer,
    75. <Out> ByRef pidl As IntPtr) As Integer
    76. End Function
    77. <DllImport("shell32.dll", EntryPoint:="SHChangeNotification_Lock")>
    78. Private Shared Function SHChangeNotification_Lock(
    79. <[In]> ByVal hChange As IntPtr,
    80. <[In]> ByVal dwProcId As Integer,
    81. <Out> ByRef ppidl As IntPtr,
    82. <Out> ByRef plEvent As SHChangeNotifyEventID) As IntPtr
    83. End Function
    84. <DllImport("shell32.dll", EntryPoint:="SHChangeNotification_Unlock")>
    85. Private Shared Function SHChangeNotification_Unlock(
    86. <[In]> ByVal hLock As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    87. End Function
    88. <DllImport("shell32.dll", EntryPoint:="SHGetPathFromIDListEx")>
    89. Private Shared Function SHGetPathFromIDListEx(
    90. <[In]> ByVal pidl As IntPtr,
    91. <[In]> <MarshalAs(UnmanagedType.LPWStr)> ByVal pszPath As String,
    92. <[In]> ByVal cchPath As Integer,
    93. <[In]> ByVal uOpts As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
    94. End Function
    95. Private m_hSHNotify As Integer = 0
    96. Private m_hNotifyLock As IntPtr = IntPtr.Zero
    97. Protected Overrides Sub WndProc(ByRef m As Message)
    98. Select Case m.Msg
    99. Case WM_SHNOTIFY
    100. ProcessShellNotify(m)
    101. Case WM_DESTROY
    102. UnregisterNotify()
    103. End Select
    104. MyBase.WndProc(m)
    105. End Sub
    106. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    107. m_hSHNotify = RegisterNotify()
    108. End Sub
    109. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    110. ListBox1.Items.Clear()
    111. End Sub
    112. Private Function RegisterNotify() As Integer
    113. Dim hSHNotify As Integer = 0
    114. Dim pPIDL As IntPtr = IntPtr.Zero
    115. Dim tSHCNE As SHChangeNotifyEntry = New SHChangeNotifyEntry
    116. If SHGetFolderLocation(IntPtr.Zero, CSIDL_DESKTOP, IntPtr.Zero, 0, pPIDL) = S_OK Then
    117. With tSHCNE
    118. .pidl = pPIDL
    119. .fRecursive = True
    120. End With
    121. hSHNotify = SHChangeNotifyRegister(Me.Handle,
    122. SHCNRF.SHCNRF_ShellLevel Or
    123. SHCNRF.SHCNRF_InterruptLevel Or
    124. SHCNRF.SHCNRF_RecursiveInterrupt Or
    125. SHCNRF.SHCNRF_NewDelivery,
    126. SHChangeNotifyEventID.SHCNE_ALLEVENTS,
    127. WM_SHNOTIFY, 1, tSHCNE)
    128. 'SHChangeNotifyEventID.SHCNE_MEDIAINSERTED Or
    129. 'SHChangeNotifyEventID.SHCNE_MEDIAREMOVED,
    130. Marshal.FreeCoTaskMem(pPIDL)
    131. End If
    132. Return hSHNotify
    133. End Function
    134. Private Sub UnregisterNotify()
    135. If m_hSHNotify <> 0 Then
    136. If SHChangeNotifyDeregister(m_hSHNotify) Then
    137. m_hSHNotify = 0
    138. End If
    139. End If
    140. End Sub
    141. Private Sub ShellNotifyEvent(ByVal intEvent As SHChangeNotifyEventID, ByVal tSHNS As SHNOTIFYSTRUCT)
    142. Dim strNullChar As Char = Convert.ToChar(0)
    143. Dim strPath1 As String = New String(strNullChar, 255)
    144. Dim strPath2 As String = New String(strNullChar, 255)
    145. If tSHNS.dwItem1 <> IntPtr.Zero Then
    146. If SHGetPathFromIDListEx(tSHNS.dwItem1, strPath1, strPath1.Length, GPFIDL_DEFAULT) Then
    147. strPath1 = strPath1.Substring(0, strPath1.IndexOf(strNullChar))
    148. Dim msg = strPath1 & " " & LookUpSHCNE(intEvent)
    149. 'Debug.Print(msg)
    150. ListBox1.Items.Add(msg)
    151. End If
    152. End If
    153. If tSHNS.dwItem2 <> IntPtr.Zero Then
    154. If SHGetPathFromIDListEx(tSHNS.dwItem2, strPath2, strPath2.Length, GPFIDL_DEFAULT) Then
    155. strPath2 = strPath2.Substring(0, strPath2.IndexOf(strNullChar))
    156. Dim msg = strPath2 & " " & LookUpSHCNE(intEvent)
    157. 'Debug.Print(msg)
    158. ListBox1.Items.Add(msg)
    159. End If
    160. End If
    161. End Sub
    162. Private Sub ProcessShellNotify(ByVal m As Message)
    163. Dim intEvent As SHChangeNotifyEventID = 0
    164. Dim pPIDL As IntPtr = IntPtr.Zero
    165. If m_hNotifyLock = IntPtr.Zero Then
    166. m_hNotifyLock = SHChangeNotification_Lock(m.WParam, m.LParam.ToInt32, pPIDL, intEvent)
    167. If m_hNotifyLock <> IntPtr.Zero Then
    168. Dim tSHNS As SHNOTIFYSTRUCT = CType(Marshal.PtrToStructure(pPIDL, GetType(SHNOTIFYSTRUCT)), SHNOTIFYSTRUCT)
    169. If SHChangeNotification_Unlock(m_hNotifyLock) Then
    170. m_hNotifyLock = IntPtr.Zero
    171. End If
    172. ShellNotifyEvent(intEvent, tSHNS)
    173. End If
    174. End If
    175. End Sub
    176. Private Shared Function LookUpSHCNE(ByVal intEvent As SHChangeNotifyEventID) As String
    177. Select Case intEvent
    178. Case SHChangeNotifyEventID.SHCNE_MEDIAINSERTED
    179. Return "MEDIA INSERTED"
    180. Case SHChangeNotifyEventID.SHCNE_MEDIAREMOVED
    181. Return "MEDIA REMOVED"
    182. End Select
    183. Return "new Item: " & intEvent.ToString()
    184. End Function
    185. 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!

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

    Amelie schrieb:

    Da tut sich aber nichts
    Steck mal die SD-Karte in den Reader.
    Und:
    Ganz alles geht wohl immeer noch nicht, abere deutlich mehr als vorher.
    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
    Nachdem ich es zum laufen brachte .. hier das Ergebnis
    Siehe Bild.

    EDIT: !! !!
    Aber es werden Zugriffen auf die Festplatten ausgegeben, wenn ich z.B. etwas speichere / öffne
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    @Amelie OK. Du hast nun die volle Bandbreite dieses Enum-Items SHCNE_ALLEVENTS. Wenn Deine Zielevents nicht kommen, werden sie möglicherweise nicht unterstützt, dann stehst Du mit Deiner Suche wieder am Anfang. :/
    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!
    Ich habe nun nochmal viel gelesen und ...
    Nun habe ich das: erstellt mit dem WMI CodeCreator

    VB.NET-Quellcode

    1. 'Imports wmi.wmiclasses
    2. Imports System
    3. Imports System.Management
    4. Imports System.Windows.Forms
    5. Public Class Form1
    6. End Class
    7. Namespace WMISample
    8. Public Class MyWMIQuery
    9. Public Overloads Shared Function Main() As Integer
    10. Try
    11. Dim searcher As New ManagementObjectSearcher( _
    12. "root\CIMV2", _
    13. "SELECT * FROM Win32_DiskDrive")
    14. For Each queryObj As ManagementObject In searcher.Get()
    15. Form1.lstSDInfo.Items.Add("-----------------------------------")
    16. Form1.lstSDInfo.Items.Add("-----------------------------------")
    17. Form1.lstSDInfo.Items.Add("Win32_DiskDrive instance")
    18. Form1.lstSDInfo.Items.Add("-----------------------------------")
    19. 'Form1.lstSDInfo.Items.Add("Status: {0}", queryObj("Status")) '<====Fehler zu viele Argumente
    20. 'Console.WriteLine("-----------------------------------")
    21. 'Console.WriteLine("Win32_DiskDrive instance")
    22. 'Console.WriteLine("-----------------------------------")
    23. Console.WriteLine("Status: {0}", queryObj("Status")) ' <========= Hier kommt der Fehler aber nicht.
    24. Next
    25. Catch err As ManagementException
    26. MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
    27. End Try
    28. End Function '<== Wenn "Console.Writeline..." Meldung fehlt ein Return?
    29. End Class
    30. End Namespace
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie OK.
    Was macht der?
    Was soll er machen?
    Gibt es Differenzen zwischen dem, was er macht und dem, was er machen soll?
    Und:
    Das ganze ist VB6-Code.
    Verstehe dies und setze es um:
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    =====
    Der Hinweis: "System.Management-DLL hinzufügen" fehlt
    Sieh Dir die Deklarationen der Prozeduren an:

    VB.NET-Quellcode

    1. Console.WriteLine(format As String, arg0 As Object) ' kennt Format-Argumente
    2. ListBox.ObjectCollection.Items.Add(item As Object) ' kennt keine Format-Argumente

    Mach es z.B. so:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. ListBox1.Items.Clear()
    3. Try
    4. Dim searcher As New ManagementObjectSearcher(
    5. "root\CIMV2",
    6. "SELECT * FROM Win32_DiskDrive")
    7. For Each queryObj As ManagementObject In searcher.Get()
    8. ListBox1.Items.Add(String.Format("Name: {0}, Status: {1}", queryObj("Name"), queryObj("Status")))
    9. Next
    10. Catch err As ManagementException
    11. MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
    12. End Try
    13. End Sub

    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!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „RodFromGermany“ ()

    Also nun bin ich soweit.
    Ist der USB-Card-Reader nicht im PC eingesteckt bleibt die Listbox leer... Rest siehe Bildanhänge.
    Den Code kann man bestimm verbessern ????

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Management
    3. Imports System.Windows.Forms
    4. Public Class Form1
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. lstSDInfo.Items.Clear()
    7. Try
    8. Dim searcher As New ManagementObjectSearcher(
    9. "root\CIMV2",
    10. "SELECT * FROM Win32_DiskDrive")
    11. Dim strTestText As String
    12. For Each di As IO.DriveInfo In IO.DriveInfo.GetDrives
    13. If di.DriveType = IO.DriveType.Removable Then
    14. strTestText = di.Name.ToString
    15. If di.IsReady = True Then
    16. lstSDInfo.Items.Add("SD Card Found")
    17. lstSDInfo.Items.Add("Drive Letter: " + di.Name)
    18. lstSDInfo.Items.Add("Drive Format: " + di.DriveFormat)
    19. lstSDInfo.Items.Add("Drive Size: " + (di.TotalSize.ToString))
    20. lstSDInfo.Items.Add(" ")
    21. lstSDInfo.Items.Add("SD Card Reader Found: " + strTestText)
    22. lstSDInfo.Items.Add("SD Card Name: " + (di.VolumeLabel.ToString))
    23. Else
    24. lstSDInfo.Items.Add("SD Card Reader Found: " + strTestText)
    25. lstSDInfo.Items.Add("SD Card Reader: is empty")
    26. End If
    27. End If
    28. Next
    29. Catch err As ManagementException
    30. MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
    31. End Try
    32. End Sub
    33. End Class
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Hab mich am Nachmittag gefragt, ob es möglich wäre, die WndProc extern auszulagern.

    Hab dann hier was unvollständiges gefunden.
    social.msdn.microsoft.com/Foru…n-gui?forum=csharpgeneral

    Das hier ist rausgekommen. Verfolge es nicht mehr weiter, bin mir aber sicher, man könnte es auch in eine DLL auslagern.

    Freundliche Grüsse

    exc-jdbi
    FrmMain

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports System.IO
    4. Imports System.Threading
    5. Imports System.ComponentModel
    6. Imports System.Runtime.InteropServices
    7. Imports System.Runtime.CompilerServices
    8. Public Class FrmMain
    9. Private Drives As List(Of DriveInfo)
    10. Private FrmToasty As FrmToastNotification
    11. Private WithEvents Notifier As DeviceChangeNotifier
    12. Private Sub BtClear_Click(sender As Object, e As EventArgs) _
    13. Handles BtClear.Click, BtRefresh.Click
    14. Select Case True
    15. Case sender Is Me.BtClear : Me.TextBox1.Clear()
    16. Case sender Is Me.BtRefresh : Me.RefreshTxtBox()
    17. End Select
    18. End Sub
    19. Private Sub FrmMain_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    20. Me.Notifier.Dispose()
    21. End Sub
    22. Private Sub RefreshTxtBox()
    23. Me.TextBox1.Clear()
    24. Me.Drives = DriveInfo.GetDrives().ToList()
    25. Me.TextBox1.AppendText(String.Join("", Me.Drives.Select(Function(di) $"{di.Name}{Environment.NewLine}").ToArray))
    26. End Sub
    27. Private Sub MyNotifier(sender As Object, e As PropertyChangedEventArgs) _
    28. Handles Notifier.PropertyChanged
    29. Me.Drives = Me.Notifier.Drives
    30. Me.Invoke(Sub() Me.RefreshTxtBox())
    31. End Sub
    32. Public Sub New()
    33. Me.InitializeComponent()
    34. Me.Notifier = New DeviceChangeNotifier
    35. Me.Drives = DriveInfo.GetDrives().ToList()
    36. Me.RefreshTxtBox()
    37. End Sub
    38. End Class

    DeviceChangeNotifier

    VB.NET-Quellcode

    1. Public Class DeviceChangeNotifier
    2. Inherits NativeWindow
    3. Implements IDisposable
    4. Implements INotifyPropertyChanged
    5. Public MIsDisposed As Boolean = False
    6. Public ReadOnly Property IsDisposed As Boolean
    7. Get
    8. Return Me.MIsDisposed
    9. End Get
    10. End Property
    11. Const WM_DEVICECHANGE As Int32 = &H219
    12. Const DBT_DEVICEARRIVAL As Int32 = &H8000
    13. Const DBT_DEVNODES_CHANGED As Int32 = &H7
    14. Const DEVTYP_DEVICEINTERFACE As Int32 = &H5
    15. Const DEVICE_NOTIFY_WINDOW_HANDLE As Int32 = &H0
    16. Const DBT_DEVICEREMOVECOMPLETE As Int32 = &H8004
    17. Private Shared ReadOnly GuidDevinterfaceUSBDevice As Guid =
    18. New Guid("A5DCBF10-6530-11D2-901F-00C04FB951ED")
    19. <DllImport("user32.dll", SetLastError:=True)>
    20. Shared Function RegisterDeviceNotification(hwnd As IntPtr, ByRef interfacein As DeviceBroadcastInterface, flags As Int32) As IntPtr
    21. End Function
    22. <DllImport("user32.dll", SetLastError:=True)>
    23. Public Shared Function UnregisterDeviceNotification(hdl As IntPtr) As Boolean
    24. End Function
    25. <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode, Pack:=1)>
    26. Public Structure DeviceBroadcastInterface
    27. Public Size As Int32
    28. Public DeviceType As Int32
    29. Public Reserved As Int32
    30. Public ClassGuid As Guid
    31. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)>
    32. Public Name As String
    33. End Structure
    34. Private MDrives As List(Of DriveInfo)
    35. Private FrmToasty As FrmToastNotification
    36. Public Property Drives As List(Of DriveInfo)
    37. Get
    38. Return Me.MDrives
    39. End Get
    40. Private Set
    41. Me.MDrives = Value
    42. Me.NotifyPropertyChanged(NameOf(Drives))
    43. End Set
    44. End Property
    45. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    46. Private Sub NotifyPropertyChanged(<CallerMemberName()> Optional PropertyName As String = Nothing)
    47. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(PropertyName))
    48. End Sub
    49. Friend Sub StartListening()
    50. Dim ctx As ApplicationContext = New ApplicationContext()
    51. Dim cp As CreateParams = New CreateParams With
    52. {
    53. .Parent = CType(-3, IntPtr)
    54. }
    55. Me.CreateHandle(cp)
    56. Application.Run(ctx)
    57. End Sub
    58. Private ThisHandle As IntPtr
    59. Protected Overrides Sub OnHandleChange()
    60. Me.ThisHandle = Me.Handle()
    61. Me.RegisterForUsbEvents(Me.Handle)
    62. End Sub
    63. Private Function RegisterForUsbEvents(hwnd As IntPtr) As IntPtr
    64. Dim interfacein = New DeviceBroadcastInterface
    65. With interfacein
    66. .Size = Marshal.SizeOf(interfacein)
    67. .ClassGuid = GuidDevinterfaceUSBDevice
    68. .DeviceType = DEVTYP_DEVICEINTERFACE
    69. .Reserved = 0
    70. End With
    71. Return RegisterDeviceNotification(hwnd, interfacein, DEVICE_NOTIFY_WINDOW_HANDLE)
    72. End Function
    73. Private Function UnregisterForUsbEvents(hhdl As IntPtr) As Boolean
    74. Return UnregisterDeviceNotification(hhdl)
    75. End Function
    76. <AllowReversePInvokeCalls>
    77. Protected Overrides Sub WndProc(ByRef msg As Message)
    78. MyBase.WndProc(msg)
    79. Dim wparam = msg.WParam.ToInt32()
    80. If msg.Msg = WM_DEVICECHANGE Then
    81. Thread.Sleep(100)
    82. Me.Drives = DriveInfo.GetDrives().ToList()
    83. Call (New FrmToastNotification).Show(Me)
    84. 'Task.Factory.StartNew(Sub() Call (New FrmToastNotification).Show(Me)).Wait()
    85. End If
    86. End Sub
    87. Public Sub New()
    88. Me.Drives = DriveInfo.GetDrives().ToList()
    89. Dim t As Thread = New Thread(AddressOf Me.StartListening)
    90. t.SetApartmentState(ApartmentState.STA)
    91. t.IsBackground = True
    92. t.Start()
    93. End Sub
    94. Protected Overridable Sub Dispose(disposing As Boolean)
    95. If Not Me.MIsDisposed Then
    96. If disposing Then
    97. UnregisterDeviceNotification(Me.ThisHandle)
    98. End If
    99. End If
    100. Me.MIsDisposed = True
    101. End Sub
    102. Protected Overrides Sub Finalize()
    103. Me.Dispose(False)
    104. MyBase.Finalize()
    105. End Sub
    106. Public Sub Dispose() Implements IDisposable.Dispose
    107. Me.Dispose(True)
    108. GC.SuppressFinalize(Me)
    109. End Sub
    110. End Class

    FrmToastNotification

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. 'Proforma, Hab kein NotifyIon dazu genommen. Funkst auch so.
    4. Public Class FrmToastNotification
    5. Private Sub Label1_DoubleClick(sender As Object, e As EventArgs) Handles Label1.DoubleClick
    6. Me.Close()
    7. End Sub
    8. Private Sub FrmToastNotification_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. Me.SetFrmAttributes()
    10. Me.Show()
    11. End Sub
    12. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    13. Me.Close()
    14. End Sub
    15. Private Sub SetFrmAttributes()
    16. Dim t = Screen.PrimaryScreen.WorkingArea.Height - Me.Height - 50
    17. Dim l = Screen.PrimaryScreen.WorkingArea.Width - Me.Width - 10
    18. Me.Location = New Point(l, t)
    19. End Sub
    20. Public Sub New()
    21. Me.InitializeComponent()
    22. Me.Timer1 = New Timer With {.Enabled = True, .Interval = 20000}
    23. Me.Timer1.Start()
    24. End Sub
    25. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ () aus folgendem Grund: Dispose nachträglich eingebaut

    Hi

    Die entsprechenden SHCNE_*-Events, die man bei SHChangeNotifyRegister angeben kann, werden natürlich erkannt und auch erst dann, wenn der Code ausgeführt wird. Man muss aber auch wissen welche Events man benötigt. SHCNE_ALLEVENTS macht kein Sinn wenn man, nach dem ausführen des Codes!, nur das einstecken/entnehmen einer SD-Karte in/aus dem CardReader automatisch erfassen möchte und das war die Frage im Startposting. Ist der CardReader (mit oder ohne SD-Karte) bereits am PC angeschlossen und man startet den Code danach, wird natürlich erst dann wieder etwas erkannt, wenn Veränderungen stattfinden. Beim WMI-Code könnte ich mir vorstellen, weil ungetestet, das dieser auch andere Removable-Laufwerke erkennt die nicht unbedingt ein CardReader sein müssen.

    Alle vorgeschlagenen Lösungen bieten bestimmt immer eine Teillösung. Die Frage ist doch immer, was möchte man erreichen?
    Mfg -Franky-
    Bei meinem letzten gezeigtem Code werden auch USB-Sticks aber keine USB-Festplatten angezeigt.
    Für mich und mein Anliegen erstmal die bis hierhin optimale Lösung. ;)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    -Franky- schrieb:

    SHCNE_ALLEVENTS macht kein Sinn wenn man, nach dem ausführen des Codes!
    Zum Testen schon, denn beim "Spielen" sieht man, welche Codes man nicht braucht und kann die rausnehmen.
    Das Enum sichert, dass der Name, nicht der numerische Wert angezeigt wird, das ist einfach handlicher.
    ====

    exc-jdbi schrieb:

    extern auszulagern.
    Geht nicht, denn das ist eine Protected Prozedur. Du kannst sie allerdings in eine Partial Class-Datei auslagern.
    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
    So ich habe noch etwas gemacht und bekomme nun diese Ausgaben.
    Schade das beim USB Stick auch der Text für den Reader angezeigt wird.. Könnte man das noch ändern?
    Gibt es in den DriveInfos da ein Bezeichner?? ?(

    EDIT: habs nun so gelöst
    Einmal SD_Card im Reader einmal ohne SD-Card
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Amelie schrieb:

    Könnte man das noch ändern?
    Klar.
    Identifiziere das Enum-Tag und dann so was:

    VB.NET-Quellcode

    1. Dim kennung = SHChangeNotifyEventID.SHCNE_ALLEVENTS
    2. kennung = kennung And Not SHChangeNotifyEventID.DEN_WERT_DEN_DU_NICHT_HABEN_WILLST_1
    3. kennung = kennung And Not SHChangeNotifyEventID.DEN_WERT_DEN_DU_NICHT_HABEN_WILLST_2
    4. kennung = kennung And Not SHChangeNotifyEventID.DEN_WERT_DEN_DU_NICHT_HABEN_WILLST_3
    5. ' ...
    6. hSHNotify = SHChangeNotifyRegister(Me.Handle,
    7. SHCNRF.SHCNRF_ShellLevel Or
    8. SHCNRF.SHCNRF_InterruptLevel Or
    9. SHCNRF.SHCNRF_RecursiveInterrupt Or
    10. SHCNRF.SHCNRF_NewDelivery,
    11. kennung,
    12. WM_SHNOTIFY, 1, tSHCNE)
    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!
    Gibt es keine Möglichkeit alle daten aus einem zu generieren? .... ?(

    "SELECT * FROM Win32_DiskDrive")
    For Each Obj As ManagementObject In searcher2.Get ....
    For Each di As IO.DriveInfo In IO.DriveInfo.GetDrives ....

    usw.. je nach dem muss man immer andere Abfragen für die Laufwerke generieren?
    Und dann kommt alles durcheiander... ;(
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Amelie schrieb:

    usw.. je nach dem muss man immer andere Abfragen für die Laufwerke generieren?
    Nicht für einzelne Laufwerke, sondern für in sich einheitliche Gruppen von Laufwerken, die dann im SQL-String explizit abgefragt werden.
    In "SELECT * FROM Win32_DiskDrive") müsstest Du dann Win32_DiskDrive durch einen anderen Typ ersetzen.
    Welchen? Keine Ahnung.
    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!
    Wie soll man denn bei dem Chaos etwas ...
    In dem einen funktioniert das man NUR externe Festplatten findet ABER man bekommt KEINE Infos über "DriveLetter, VolumenName etc.."
    In dem anderen bekommt man alle Infos zu DriveLetter etc ABER es wird NICHT unterschieden ob extern etc...
    Das ist doch alles völlig unlogisch aufgebaut....
    Wie kann man das denn nun zusammen bekommen? ?(
    Spoiler anzeigen

    VB.NET-Quellcode

    1. '............. Hier funktioniert die SQL Abfrage NICHT ABER es werden ALLE Platten aufgelistet.
    2. Dim suche1 As New ManagementObjectSearcher("SELECT * FROM Win32_diskdrive where MediaType='External hard disk media'")
    3. For Each di As IO.DriveInfo In IO.DriveInfo.GetDrives
    4. Dim strText As String
    5. Dim strName As String
    6. Dim strSize As String
    7. strText = di.Name.ToString
    8. If di.IsReady = True Then
    9. strName = di.VolumeLabel.ToString
    10. strSize = convert(di.TotalSize, "0.00")
    11. Else
    12. strName = "" : strSize = ""
    13. End If
    14. If di.DriveType = IO.DriveType.Fixed Then
    15. lst_view.Items.Add(New ListViewItem({strText, strName, strSize}, lst_view.Groups(0)))
    16. Else
    17. lst_view.Items.Add(New ListViewItem({strText, strName, strSize}, lst_view.Groups(2)))
    18. End If
    19. Next
    20. '................Hier geht die SQL Abfrage und zeigt nur die externe Platte an ABER man bekommt keine weiteren brauchbaren infos ( Drivletter etc.)
    21. Dim suche2 As ManagementObjectSearcher = New ManagementObjectSearcher("SELECT * FROM Win32_diskdrive where MediaType='External hard disk media'")
    22. For Each di As ManagementObject In suche2.Get()
    23. Dim strSize As String
    24. strSize = convert(CDbl(di.GetPropertyValue("Size")), "0.00")
    25. lst_view.Items.Add(New ListViewItem({strSize}, lst_view.Groups(1)))
    26. Next

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    @Amelie Anders herum.
    Woher hast Du denn den String FROM Win32_diskdrive where MediaType='External hard disk media?
    Welche Abfragen werden im SQL-String supportet?
    Kläre das mal auf.
    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
    Gefunden unter anderem hier:
    Erkennen, wann ein Laufwerk hinzugefügt bzw. entfernt wurde (USB-Stick)

    Das funktioniert ja auch " fast " (siehe Bild) nur das ich da außer der Größe keine anderen für mich brauchbaren Infos herbekomme.
    Wenn ich die Abfrage versuche mit "DriveInfo" zu kombinieren gibt es wieder Chaos...
    Scheinbar ist es wohl nicht möglich das so hinzubekommen.

    Unter "DriveType" "Removable" gelten Nur USB-Sticks usw aber wohl keine USB-Festplatten ( für mich wieder völlig unlogisch )
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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