@@ -20,7 +20,7 @@ public unsafe partial class WindowsFolderWatcher : IFolderWatcher
2020 {
2121 // Fields
2222
23- private const uint WM_FOLDERWATCHER = PInvoke . WM_APP | 0x0001U ;
23+ private const uint WM_NOTIFYFOLDERCHANGE = PInvoke . WM_APP | 0x0001U ;
2424 private readonly WNDPROC _wndProc ;
2525
2626 private uint _watcherRegID = 0U ;
@@ -34,42 +34,38 @@ public unsafe partial class WindowsFolderWatcher : IFolderWatcher
3434
3535 public event NotifyCollectionChangedEventHandler ? CollectionChanged ;
3636
37- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? ItemAssocChanged ; // SHCNE_ASSOCCHANGED
38- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? ItemAttributesChanged ; // SHCNE_ATTRIBUTES
39- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? ItemImageUpdated ; // SHCNE_UPDATEIMAGE
37+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? ItemAssocChanged ; // SHCNE_ASSOCCHANGED
38+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? ItemAttributesChanged ; // SHCNE_ATTRIBUTES
39+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? ItemImageUpdated ; // SHCNE_UPDATEIMAGE
4040
41- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? FileRenamed ; // SHCNE_RENAMEITEM
42- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? FileCreated ; // SHCNE_CREATE
43- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? FileDeleted ; // SHCNE_DELETE
44- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? FileUpdated ; // SHCNE_UPDATEITEM
41+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? FileRenamed ; // SHCNE_RENAMEITEM
42+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? FileCreated ; // SHCNE_CREATE
43+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? FileDeleted ; // SHCNE_DELETE
44+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? FileUpdated ; // SHCNE_UPDATEITEM
4545
46- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? FolderRenamed ; // SHCNE_RENAMEFOLDER
47- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? FolderCreated ; // SHCNE_MKDIR
48- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? FolderDeleted ; // SHCNE_RMDIR
49- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? FolderUpdated ; // SHCNE_UPDATEDIR
46+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? FolderRenamed ; // SHCNE_RENAMEFOLDER
47+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? FolderCreated ; // SHCNE_MKDIR
48+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? FolderDeleted ; // SHCNE_RMDIR
49+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? FolderUpdated ; // SHCNE_UPDATEDIR
5050
51- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? MediaInserted ; // SHCNE_MEDIAINSERTED
52- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? MediaRemoved ; // SHCNE_MEDIAREMOVED
53- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? DriveRemoved ; // SHCNE_DRIVEREMOVED
54- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? DriveAdded ; // SHCNE_DRIVEADD
55- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? DriveAddedViaGUI ; // SHCNE_DRIVEADDGUI
56- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? DiskEventOccurred ; // SHCNE_DISKEVENTS
57- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? FreeSpaceUpdated ; // SHCNE_FREESPACE
51+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? MediaInserted ; // SHCNE_MEDIAINSERTED
52+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? MediaRemoved ; // SHCNE_MEDIAREMOVED
53+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? DriveRemoved ; // SHCNE_DRIVEREMOVED
54+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? DriveAdded ; // SHCNE_DRIVEADD
55+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? DriveAddedViaGUI ; // SHCNE_DRIVEADDGUI
56+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? FreeSpaceUpdated ; // SHCNE_FREESPACE
5857
59- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? SharingStarted ; // SHCNE_NETSHARE
60- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? SharingStopped ; // SHCNE_NETUNSHARE
58+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? SharingStarted ; // SHCNE_NETSHARE
59+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? SharingStopped ; // SHCNE_NETUNSHARE
6160
62- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? DisconnectedFromServer ; // SHCNE_SERVERDISCONNECT
61+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? DisconnectedFromServer ; // SHCNE_SERVERDISCONNECT
6362
64- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? ExtendedEventOccurred ; // SHCNE_EXTENDED_EVENT
65- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? GlobalEventOccurred ; // SHCNE_GLOBALEVENTS
66- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? SystemInterruptOccurred ; // SHCNE_INTERRUPT
63+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? ExtendedEventOccurred ; // SHCNE_EXTENDED_EVENT
64+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? SystemInterruptOccurred ; // SHCNE_INTERRUPT
6765
6866 // Constructor
6967
70- /// <summary>
71- /// Initializes a new instance of the <see cref="WindowsFolderWatcher"/> class.
72- /// </summary>
68+ /// <summary>Initializes a new instance of the <see cref="WindowsFolderWatcher"/> class.</summary>
7369 /// <param name="folder">Specifies the folder to be monitored for changes.</param>
7470 public WindowsFolderWatcher ( WindowsFolder folder )
7571 {
@@ -110,19 +106,19 @@ private unsafe LRESULT WndProc(HWND hWnd, uint uMessage, WPARAM wParam, LPARAM l
110106 hWnd ,
111107 SHCNRF_SOURCE . SHCNRF_ShellLevel | SHCNRF_SOURCE . SHCNRF_NewDelivery ,
112108 ( int ) SHCNE_ID . SHCNE_ALLEVENTS ,
113- WM_FOLDERWATCHER ,
109+ WM_NOTIFYFOLDERCHANGE ,
114110 1 ,
115111 & changeNotifyEntry ) ;
116112
117113 if ( _watcherRegID is 0U )
118114 break ;
119115 }
120116 break ;
121- case WM_FOLDERWATCHER :
117+ case WM_NOTIFYFOLDERCHANGE :
122118 {
123119 ITEMIDLIST * * ppidl ;
124- int lEvent = 0 ;
125- HANDLE hLock = PInvoke . SHChangeNotification_Lock ( ( HANDLE ) ( nint ) wParam . Value , ( uint ) lParam . Value , & ppidl , & lEvent ) ;
120+ uint lEvent = 0 ;
121+ HANDLE hLock = PInvoke . SHChangeNotification_Lock ( ( HANDLE ) ( nint ) wParam . Value , ( uint ) lParam . Value , & ppidl , ( int * ) & lEvent ) ;
126122
127123 if ( hLock . IsNull )
128124 break ;
@@ -142,6 +138,123 @@ private unsafe LRESULT WndProc(HWND hWnd, uint uMessage, WPARAM wParam, LPARAM l
142138 return PInvoke . DefWindowProc ( hWnd , uMessage , wParam , lParam ) ;
143139 }
144140
141+ private void FireEvent ( SHCNE_ID eventType , ITEMIDLIST * * ppidl )
142+ {
143+ switch ( eventType )
144+ {
145+ case SHCNE_ID . SHCNE_ASSOCCHANGED :
146+ {
147+ ItemAssocChanged ? . Invoke ( this , new ( eventType ) ) ;
148+ }
149+ break ;
150+ case SHCNE_ID . SHCNE_ATTRIBUTES :
151+ {
152+ ItemAttributesChanged ? . Invoke ( this , new ( eventType ) ) ;
153+ }
154+ break ;
155+ case SHCNE_ID . SHCNE_UPDATEIMAGE :
156+ {
157+ ItemImageUpdated ? . Invoke ( this , new ( eventType ) ) ;
158+ }
159+ break ;
160+ case SHCNE_ID . SHCNE_RENAMEITEM :
161+ {
162+ FileRenamed ? . Invoke ( this , new ( eventType ) ) ;
163+ }
164+ break ;
165+ case SHCNE_ID . SHCNE_CREATE :
166+ {
167+ FileCreated ? . Invoke ( this , new ( eventType ) ) ;
168+ }
169+ break ;
170+ case SHCNE_ID . SHCNE_DELETE :
171+ {
172+ FileDeleted ? . Invoke ( this , new ( eventType ) ) ;
173+ }
174+ break ;
175+ case SHCNE_ID . SHCNE_UPDATEITEM :
176+ {
177+ FileUpdated ? . Invoke ( this , new ( eventType ) ) ;
178+ }
179+ break ;
180+ case SHCNE_ID . SHCNE_RENAMEFOLDER :
181+ {
182+ FolderRenamed ? . Invoke ( this , new ( eventType ) ) ;
183+ }
184+ break ;
185+ case SHCNE_ID . SHCNE_MKDIR :
186+ {
187+ FolderCreated ? . Invoke ( this , new ( eventType ) ) ;
188+ }
189+ break ;
190+ case SHCNE_ID . SHCNE_RMDIR :
191+ {
192+ FolderDeleted ? . Invoke ( this , new ( eventType ) ) ;
193+ }
194+ break ;
195+ case SHCNE_ID . SHCNE_UPDATEDIR :
196+ {
197+ FolderUpdated ? . Invoke ( this , new ( eventType ) ) ;
198+ }
199+ break ;
200+ case SHCNE_ID . SHCNE_MEDIAINSERTED :
201+ {
202+ MediaInserted ? . Invoke ( this , new ( eventType ) ) ;
203+ }
204+ break ;
205+ case SHCNE_ID . SHCNE_MEDIAREMOVED :
206+ {
207+ MediaRemoved ? . Invoke ( this , new ( eventType ) ) ;
208+ }
209+ break ;
210+ case SHCNE_ID . SHCNE_DRIVEREMOVED :
211+ {
212+ DriveRemoved ? . Invoke ( this , new ( eventType ) ) ;
213+ }
214+ break ;
215+ case SHCNE_ID . SHCNE_DRIVEADD :
216+ {
217+ DriveAdded ? . Invoke ( this , new ( eventType ) ) ;
218+ }
219+ break ;
220+ case SHCNE_ID . SHCNE_DRIVEADDGUI :
221+ {
222+ DriveAddedViaGUI ? . Invoke ( this , new ( eventType ) ) ;
223+ }
224+ break ;
225+ case SHCNE_ID . SHCNE_FREESPACE :
226+ {
227+ FreeSpaceUpdated ? . Invoke ( this , new ( eventType ) ) ;
228+ }
229+ break ;
230+ case SHCNE_ID . SHCNE_NETSHARE :
231+ {
232+ SharingStarted ? . Invoke ( this , new ( eventType ) ) ;
233+ }
234+ break ;
235+ case SHCNE_ID . SHCNE_NETUNSHARE :
236+ {
237+ SharingStopped ? . Invoke ( this , new ( eventType ) ) ;
238+ }
239+ break ;
240+ case SHCNE_ID . SHCNE_SERVERDISCONNECT :
241+ {
242+ DisconnectedFromServer ? . Invoke ( this , new ( eventType ) ) ;
243+ }
244+ break ;
245+ case SHCNE_ID . SHCNE_EXTENDED_EVENT :
246+ {
247+ ExtendedEventOccurred ? . Invoke ( this , new ( eventType ) ) ;
248+ }
249+ break ;
250+ case SHCNE_ID . SHCNE_INTERRUPT :
251+ {
252+ SystemInterruptOccurred ? . Invoke ( this , new ( eventType ) ) ;
253+ }
254+ break ;
255+ }
256+ }
257+
145258 public void Dispose ( )
146259 {
147260 PInvoke . SHChangeNotifyDeregister ( _watcherRegID ) ;
0 commit comments