@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
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"
....
VB.NET-Quellcode
-
- Imports System.Runtime.InteropServices
- Public Class Form1
- Private Const S_OK As Integer = &H0
- Private Const WM_DESTROY As Integer = &H2
- Private Const WM_SHNOTIFY As Integer = &H488
- Private Const CSIDL_DESKTOP As Integer = &H0
- Private Const GPFIDL_DEFAULT As Integer = &H0
- Private Const SHCNE_MEDIAREMOVED As Integer = &H40
- Private Const SHCNE_MEDIAINSERTED As Integer = &H20
- Private Enum SHCNRF As Integer
- SHCNRF_InterruptLevel = &H1
- SHCNRF_ShellLevel = &H2
- SHCNRF_RecursiveInterrupt = &H1000
- SHCNRF_NewDelivery = &H8000
- End Enum
- <StructLayout(LayoutKind.Sequential)>
- Private Structure SHChangeNotifyEntry
- Dim pidl As IntPtr
- <MarshalAs(UnmanagedType.Bool)> Dim fRecursive As Boolean
- End Structure
- <StructLayout(LayoutKind.Sequential)>
- Private Structure SHNOTIFYSTRUCT
- Dim dwItem1 As IntPtr
- Dim dwItem2 As IntPtr
- End Structure
- <DllImport("ole32.dll", EntryPoint:="CoTaskMemFree")>
- Private Shared Sub CoTaskMemFree(
- <[In]> ByVal hMem As IntPtr)
- End Sub
- <DllImport("shell32.dll", EntryPoint:="SHChangeNotifyRegister")>
- Private Shared Function SHChangeNotifyRegister(
- <[In]> ByVal hWnd As IntPtr,
- <[In]> ByVal fSources As SHCNRF,
- <[In]> ByVal fEvents As Integer,
- <[In]> ByVal wMsg As Integer,
- <[In]> ByVal cEntries As Integer,
- <[In]> ByRef lpps As SHChangeNotifyEntry) As Integer
- End Function
- <DllImport("shell32.dll", EntryPoint:="SHChangeNotifyDeregister")>
- Private Shared Function SHChangeNotifyDeregister(
- <[In]> ByVal hNotify As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
- End Function
- <DllImport("shell32.dll", EntryPoint:="SHGetFolderLocation")>
- Private Shared Function SHGetFolderLocation(
- <[In]> ByVal hwndOwner As IntPtr,
- <[In]> ByVal nFolder As Integer,
- <[In]> ByVal hToken As IntPtr,
- <[In]> ByVal dwReserved As Integer,
- <Out> ByRef pidl As IntPtr) As Integer
- End Function
- <DllImport("shell32.dll", EntryPoint:="SHChangeNotification_Lock")>
- Private Shared Function SHChangeNotification_Lock(
- <[In]> ByVal hChange As IntPtr,
- <[In]> ByVal dwProcId As Integer,
- <Out> ByRef ppidl As IntPtr,
- <Out> ByRef plEvent As Integer) As IntPtr
- End Function
- <DllImport("shell32.dll", EntryPoint:="SHChangeNotification_Unlock")>
- Private Shared Function SHChangeNotification_Unlock(
- <[In]> ByVal hLock As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
- End Function
- <DllImport("shell32.dll", EntryPoint:="SHGetPathFromIDListEx")>
- Private Shared Function SHGetPathFromIDListEx(
- <[In]> ByVal pidl As IntPtr,
- <[In]> <MarshalAs(UnmanagedType.LPWStr)> ByVal pszPath As String,
- <[In]> ByVal cchPath As Integer,
- <[In]> ByVal uOpts As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
- End Function
- Private m_hSHNotify As Integer = 0
- Private m_hNotifyLock As IntPtr = IntPtr.Zero
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- m_hSHNotify = RegisterNotify()
- End Sub
- Protected Overrides Sub WndProc(ByRef m As Message)
- Select Case m.Msg
- Case WM_SHNOTIFY
- ProcessShellNotify(m)
- Case WM_DESTROY
- UnregisterNotify()
- End Select
- MyBase.WndProc(m)
- End Sub
- Private Function RegisterNotify() As Integer
- Dim hSHNotify As Integer = 0
- Dim pPIDL As IntPtr = IntPtr.Zero
- Dim tSHCNE As SHChangeNotifyEntry = New SHChangeNotifyEntry
- If SHGetFolderLocation(IntPtr.Zero, CSIDL_DESKTOP,
- IntPtr.Zero, 0, pPIDL) = S_OK Then
- With tSHCNE
- .pidl = pPIDL
- .fRecursive = True
- End With
- hSHNotify = SHChangeNotifyRegister(Me.Handle,
- SHCNRF.SHCNRF_ShellLevel Or
- SHCNRF.SHCNRF_InterruptLevel Or
- SHCNRF.SHCNRF_RecursiveInterrupt Or
- SHCNRF.SHCNRF_NewDelivery,
- SHCNE_MEDIAINSERTED Or
- SHCNE_MEDIAREMOVED,
- WM_SHNOTIFY, 1, tSHCNE)
- Marshal.FreeCoTaskMem(pPIDL) ' <- erst nach SHChangeNotifyRegister freigeben
- 'CoTaskMemFree(pPIDL) ' <- API CoTaskMemFree durch Marshal.FreeCoTaskMem ersetzt.
- End If
- Return hSHNotify
- End Function
- Private Sub UnregisterNotify()
- If m_hSHNotify <> 0 Then
- If SHChangeNotifyDeregister(m_hSHNotify) = True Then
- m_hSHNotify = 0
- End If
- End If
- End Sub
- Private Shared Sub ShellNotifyEvent(ByVal intEvent As Integer,
- ByVal tSHNS As SHNOTIFYSTRUCT)
- Dim strNullChar As Char = Convert.ToChar(0)
- Dim strPath1 As String = New String(strNullChar, 255)
- Dim strPath2 As String = New String(strNullChar, 255)
- If tSHNS.dwItem1 <> IntPtr.Zero Then
- If SHGetPathFromIDListEx(tSHNS.dwItem1, strPath1,
- strPath1.Length, GPFIDL_DEFAULT) = True Then
- strPath1 = strPath1.Substring(0, strPath1.IndexOf(strNullChar))
- Debug.Print(strPath1 & " " & LookUpSHCNE(intEvent))
- End If
- End If
- If tSHNS.dwItem2 <> IntPtr.Zero Then
- If SHGetPathFromIDListEx(tSHNS.dwItem2, strPath2,
- strPath2.Length, GPFIDL_DEFAULT) = True Then
- strPath2 = strPath2.Substring(0, strPath2.IndexOf(strNullChar))
- Debug.Print(strPath2 & " " & LookUpSHCNE(intEvent))
- End If
- End If
- End Sub
- Private Sub ProcessShellNotify(ByVal m As Message)
- Dim intEvent As Integer = 0
- Dim pPIDL As IntPtr = IntPtr.Zero
- If m_hNotifyLock = IntPtr.Zero Then
- m_hNotifyLock = SHChangeNotification_Lock(m.WParam, m.LParam.ToInt32,
- pPIDL, intEvent)
- If m_hNotifyLock <> IntPtr.Zero Then
- Dim tSHNS As SHNOTIFYSTRUCT = CType(Marshal.PtrToStructure(pPIDL,
- GetType(SHNOTIFYSTRUCT)), SHNOTIFYSTRUCT)
- If SHChangeNotification_Unlock(m_hNotifyLock) = True Then
- m_hNotifyLock = IntPtr.Zero
- End If
- ShellNotifyEvent(intEvent, tSHNS)
- End If
- End If
- End Sub
- Private Shared Function LookUpSHCNE(ByVal intEvent As Integer) As String
- Dim strRet As String = String.Empty
- Select Case intEvent
- Case SHCNE_MEDIAINSERTED
- strRet = "MEDIA INSERTED"
- Case SHCNE_MEDIAREMOVED
- strRet = "MEDIA REMOVED"
- End Select
- Return strRet
- End Function
- End Class
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen.