@@ -20,7 +20,7 @@ public unsafe partial class WindowsFolderWatcher : IFolderWatcher
20
20
{
21
21
// Fields
22
22
23
- private const uint WM_FOLDERWATCHER = PInvoke . WM_APP | 0x0001U ;
23
+ private const uint WM_NOTIFYFOLDERCHANGE = PInvoke . WM_APP | 0x0001U ;
24
24
private readonly WNDPROC _wndProc ;
25
25
26
26
private uint _watcherRegID = 0U ;
@@ -34,42 +34,38 @@ public unsafe partial class WindowsFolderWatcher : IFolderWatcher
34
34
35
35
public event NotifyCollectionChangedEventHandler ? CollectionChanged ;
36
36
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
40
40
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
45
45
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
50
50
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
58
57
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
61
60
62
- public event TypedEventHandler < WindowsFolderWatcher , IWindowsStorable > ? DisconnectedFromServer ; // SHCNE_SERVERDISCONNECT
61
+ public event TypedEventHandler < WindowsFolderWatcher , WindowsFolderWatcherEventArgs > ? DisconnectedFromServer ; // SHCNE_SERVERDISCONNECT
63
62
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
67
65
68
66
// Constructor
69
67
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>
73
69
/// <param name="folder">Specifies the folder to be monitored for changes.</param>
74
70
public WindowsFolderWatcher ( WindowsFolder folder )
75
71
{
@@ -110,19 +106,19 @@ private unsafe LRESULT WndProc(HWND hWnd, uint uMessage, WPARAM wParam, LPARAM l
110
106
hWnd ,
111
107
SHCNRF_SOURCE . SHCNRF_ShellLevel | SHCNRF_SOURCE . SHCNRF_NewDelivery ,
112
108
( int ) SHCNE_ID . SHCNE_ALLEVENTS ,
113
- WM_FOLDERWATCHER ,
109
+ WM_NOTIFYFOLDERCHANGE ,
114
110
1 ,
115
111
& changeNotifyEntry ) ;
116
112
117
113
if ( _watcherRegID is 0U )
118
114
break ;
119
115
}
120
116
break ;
121
- case WM_FOLDERWATCHER :
117
+ case WM_NOTIFYFOLDERCHANGE :
122
118
{
123
119
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 ) ;
126
122
127
123
if ( hLock . IsNull )
128
124
break ;
@@ -142,6 +138,123 @@ private unsafe LRESULT WndProc(HWND hWnd, uint uMessage, WPARAM wParam, LPARAM l
142
138
return PInvoke . DefWindowProc ( hWnd , uMessage , wParam , lParam ) ;
143
139
}
144
140
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
+
145
258
public void Dispose ( )
146
259
{
147
260
PInvoke . SHChangeNotifyDeregister ( _watcherRegID ) ;
0 commit comments