Får meldinger fra shell

Hvordan koble til skallet interne arrangement triggeringIf du noen gang har hatt behov for å vite når skallet utsteder en hendelse her er en wrapper rundt SHChangeNotifyRegister wich lar deg vite hva slags arrangement og filen (e) berørt, dette komponenten er i fase 1 av developement men det gir hele functionality.The komponenten i seg selv består av forbedringer gjort i TSHChangeNotify komponent av Elliott Shevin ([email protected]) Forresten her er en liste over ting du bør være oppmerksom på når du bruker denne komponenten for eksempel gjenopprette et element fra papirkurven til den opprinnelige plasseringen sving på en nytt navn hendelse, mens du får en melding i løpet av en hendelse du kan ikke stoppe det får du bare beskjed om it.Deleting et element fører 3 arrangementer: OnFileDelete (Når dialogen, eller mangel på, vises normalt dette er før sletting av filen) en OnFolderUpdate (etter elementet er fjernet og mappen oppdateres) og overraskelsen enda en OnFileDelete (etter at filen har fullstendig blitt slettet) denne atferden er ikke av komponenten, men av api den er avhengig on.Also ifølge noen dokumentasjon jeg leste APIer brukes på denne artikkelen er helt udokumentert, kanskje det kan være mulig å stoppe arrangementet men på grunn av manglende dokumentasjon, er det ukjent for meg . < -------------- Begynn UNIT kode ---------------------------- > {$ IFNDEF VER80} {$ IFNDEF VER90} {$ IFNDEF VER93} {$ DEFINE Delphi3orHigher} {$ ENDIF} {$ ENDIF} {$ ENDIF} enhet ShellNotify; interfaceuses Windows, Meldinger, SysUtils, klasser, Kontroller, Skjemaer, Dialoger, {$ IFNDEF Delphi3orHigher} OLE2, {$ ELSE} ActiveX, ComObj, {$ ENDIF} ShlObj -typen NOTIFYREGISTER = rekord pidlPath: PItemIDList; bWatchSubtree: boolean; slutt; PNOTIFYREGISTER = ^ NOTIFYREGISTER; konst SNM_SHELLNOTIFICATION = WM_USER 1; SHCNF_ACCEPT_INTERRUPTS = $ 0001; SHCNF_ACCEPT_NON_INTERRUPTS = $ 0002; SHCNF_NO_PROXY = $ 8000; typen TNotificationEvent = (neAssociationChange, neAttributesChange, neFileChange, neFileCreate, neFileDelete, neFileRename, neDriveAdd, neDriveRemove, neShellDriveAdd, neDriveSpaceChange, neMediaInsert, neMediaRemove, neFolderCreate, neFolderDelete, neFolderRename, neFolderUpdate, neNetShare, neNetUnShare, neServerDisconnect, neImageListChange); TNotificationEvents = sett av TNotificationEvent; TShellNotificationEvent1 = prosedyre (Sender: TObject; Sti: String) av Object; TShellNotificationEvent2 = prosedyre (Sender: TObject; STI1, path2: String) av Object; TShellNotification = klasse (TComponent) private fWatchEvents: TNotificationEvents; fPath: String; fActive, fWatch: Boolean; prevPath1, prevPath2: String; PrevEvent: Integer; Håndtak, NotifyHandle: HWND; fOnAssociationChange: TNotifyEvent; fOnAttribChange: TShellNotificationEvent2; FOnCreate: TShellNotificationEvent1; FOnDelete: TShellNotificationEvent1; FOnDriveAdd: TShellNotificationEvent1; FOnDriveAddGui: TShellNotificationEvent1; FOnDriveRemove: TShellNotificationEvent1; FOnMediaInsert: TShellNotificationEvent1; FOnMediaRemove: TShellNotificationEvent1; FOnDirCreate: TShellNotificationEvent1; FOnNetShare: TShellNotificationEvent1; FOnNetUnShare: TShellNotificationEvent1; FOnRenameFolder: TShellNotificationEvent2; FOnItemRename: TShellNotificationEvent2; FOnFolderRemove: TShellNotificationEvent1; FOnServerDisconnect: TShellNotificationEvent1; FOnFolderUpdate: TShellNotificationEvent1; funksjon PathFromPidl (Pidl: PItemIDList): String; prosedyre SetWatchEvents (konst Verdi: TNotificationEvents); funksjon GetActive: Boolean; Prosedyren SetActive (konst Verdi: Boolean); Prosedyren SetPath (konst Verdi: String); Prosedyren SetWatch (konst Verdi: Boolean); beskyttet prosedyre ShellNotifyRegister; prosedyre ShellNotifyUnregister; Prosedyren WndProc (var Melding: TMessage); prosedyre DoAssociationChange; dynamisk; Prosedyren DoAttributesChange (STI1, path2: String); dynamisk; Prosedyren DoCreateFile (Sti: String); dynamisk; Prosedyren DoDeleteFile (Sti: String); dynamisk; Prosedyren DoDriveAdd (Sti: String); dynamisk; Prosedyren DoDriveAddGui (Sti: String); dynamisk; Prosedyren DoDriveRemove (Sti: String); dynamisk; Prosedyren DoMediaInsert (Sti: String); dynamisk; Prosedyren DoMediaRemove (Sti: String); dynamisk; Prosedyren DoDirCreate (Sti: String); dynamisk; Prosedyren DoNetShare (Sti: String); dynamisk; Prosedyren DoNetUnShare (Sti: String); dynamisk; Prosedyren DoRenameFolder (STI1, path2: String); dynamisk; Prosedyren DoRenameItem (STI1, path2: String); dynamisk; Prosedyren DoFolderRemove (Sti: String); dynamisk; Prosedyren DoServerDisconnect (Sti: String); dynamisk; Prosedyren DoDirUpdate (Sti: String); dynamisk; offentlig konstruktør Opprette (AOwner: TComponent); styre; destructor Destroy; styre; publisert eiendom Sti: String lese fPath skrive SetPath; Eiendommen Aktiv: Boolean lese GetActive skrive SetActive; Eiendommen WatchSubTree: Boolean lese fWatch skrive SetWatch; eiendoms WatchEvents: TNotificationEvents lese fWatchEvents skrive SetWatchEvents; Eiendommen OnAssociationChange: TNotifyEvent lese fOnAssociationChange skrive FOnAssociationChange; Eiendommen OnAttributesChange: TShellNotificationEvent2 lese fOnAttribChange skrive fOnAttribChange; Eiendommen OnFileCreate: TShellNotificationEvent1 lese FOnCreate skrive FOnCreate; Eiendommen OnFolderRename: TShellNotificationEvent2 lese FOnRenameFolder skrive FOnRenameFolder; Eiendommen OnFolderUpdate: TShellNotificationEvent1 lese FOnFolderUpdate skrive FOnFolderUpdate; Eiendommen OnFileDelete: TShellNotificationEvent1 lese FOnDelete skrive FOnDelete; Eiendommen OnDriveAdd: TShellNotificationEvent1 lese FOnDriveAdd skrive FOnDriveAdd; Eiendommen OnFolderRemove: TShellNotificationEvent1 lese FOnFolderRemove skrive FOnFolderRemove; Eiendommen OnItemRename: TShellNotificationEvent2 lese FOnItemRename skrive FOnItemRename; Eiendommen OnDriveAddGui: TShellNotificationEvent1 lese FOnDriveAddGui skrive FOnDriveAddGui; Eiendommen OnDriveRemove: TShellNotificationEvent1 lese FOnDriveRemove skrive FOnDriveRemove; Eiendommen OnMediaInserted: TShellNotificationEvent1 lese FOnMediaInsert skrive FOnMediaInsert; Eiendommen OnMediaRemove: TShellNotificationEvent1 lese FOnMediaRemove skrive FOnMediaRemove; Eiendommen OnDirCreate: TShellNotificationEvent1 lese FOnDirCreate skrive FOnDirCreate; Eiendommen OnNetShare: TShellNotificationEvent1 lese FOnNetShare skrive FOnNetShare; Eiendommen OnNetUnShare: TShellNotificationEvent1 lese FOnNetUnShare skrive FOnNetUnShare; Eiendommen OnServerDisconnect: TShellNotificationEvent1 lese FOnServerDisconnect skrive FOnServerDisconnect; slutt; funksjon SHChangeNotifyRegister (hWnd: HWND; dwFlags: integer; wEventMask: kardinal; uMsg: UINT; cItems: integer; lpItems: PNOTIFYREGISTER): HWND; STDCALL; funksjon SHChangeNotifyDeregister (hWnd: HWND): boolean; STDCALL; funksjon SHILCreateFromPath (Sti: Pointer; PIDL: PItemIDList; Var attributter: ULONG): hresult; STDCALL; Prosedyren Register; implementationconst Shell32DLL = 'shell32.dll'; fungere SHChangeNotifyRegister; ekstern Shell32DLL index 2; fungere SHChangeNotifyDeregister; ekstern Shell32DLL indeksen 4; funksjon SHILCreateFromPath; ekstern Shell32DLL index 28; {TShellNotification} konstruktør TShellNotification.Create (AOwner: TComponent); begynner arvet Opprette (AOwner); hvis ikke (csDesigning i ComponentState) så Handle: = AllocateHWnd (WndProc); PrevEvent: = 0; fWatchEvents: = [neAssociationChange, neAttributesChange, neFileChange, neFileCreate, neFileDelete, neFileRename, neDriveAdd, neDriveRemove, neShellDriveAdd, neDriveSpaceChange, neMediaInsert, neMediaRemove, neFolderCreate, neFolderDelete, neFolderRename, neFolderUpdate, neNetShare, neNetUnShare, neServerDisconnect, neImageListChange]; ende; destructor TShellNotification. ødelegg, begynner om ikke (csDesigning i ComponentState) deretter Active: = False; hvis Håndtak < > 0 da DeallocateHWnd (Handle); arvet Destroy; ende; prosedyre TShellNotification.DoAssociationChange; begynne hvis Assigned (fOnAssociationChange) og (neAssociationChange i fWatchEvents) så fOnAssociationChange (Selv); ende; prosedyre TShellNotification.DoAttributesChange; begynne hvis Assigned (fOnAttribChange) da fOnAttribChange (Self, STI1, path2); ende; prosedyre TShellNotification.DoCreateFile (Sti: String); begynne hvis Assigned (fOnCreate) da FOnCreate (Self, Sti) ende; prosedyre TShellNotification.DoDeleteFile (Sti: String); begynne hvis Assigned (FOnDelete) da FOnDelete (Self, Sti ); end; prosedyre TShellNotification.DoDirCreate (Sti: String); begynne hvis Assigned (FOnDirCreate) da FOnDirCreate (Self, Sti); ende; prosedyre TShellNotification.DoDirUpdate (Sti: String); begynne hvis Assigned (FOnFolderUpdate) da FOnFolderUpdate (Selv , Sti); ende; prosedyre TShellNotification.DoDriveAdd (Sti: String); begynne hvis Assigned (FOnDriveAdd) da FOnDriveAdd (Self, Sti); ende; prosedyre TShellNotification.DoDriveAddGui (Sti: String); begynne hvis Assigned (FOnDriveAddGui) da FOnDriveAdd (Self, Sti); ende; prosedyre TShellNotification.DoDriveRemove (Sti: String); begynne hvis Assigned (FOnDriveRemove) da FOnDriveRemove (Self, Sti); ende; prosedyre TShellNotification.DoFolderRemove (Sti: String); begynne hvis Assigned (FOnFolderRemove) deretter FOnFolderRemove (Self, Sti); ende; prosedyre TShellNotification.DoMediaInsert (Sti: String); begynne hvis Assigned (FOnMediaInsert) da FOnMediaInsert (Self, Sti); ende; prosedyre TShellNotification.DoMediaRemove (Sti: String); begynne hvis Assigned ( FOnMediaRemove) så FOnMediaRemove (Self, Sti); ende; prosedyre TShellNotification.DoNetShare (Sti: String); begynne hvis Assigned (FOnNetShare) da FOnNetShare (Self, Sti); ende; prosedyre TShellNotification.DoNetUnShare (Sti: String); begynne hvis tildelt (FOnNetUnShare) da FOnNetUnShare (Self, Sti); ende; prosedyre TShellNotification.DoRenameFolder (STI1, path2: String); begynne hvis tildeles (FOnRenameFolder) da FOnRenameFolder (Self, STI1, path2); ende; prosedyre TShellNotification.DoRenameItem (STI1 , path2: String); begynne hvis Assigned (FOnItemRename) da FonItemRename (Self, STI1, path2); ende; prosedyre TShellNotification.DoServerDisconnect (Sti: String); begynne hvis Assigned (FOnServerDisconnect) da FOnServerDisconnect (Self, Sti); end; funksjon TShellNotification.GetActive: Boolean, begynner Resultat: = (NotifyHandle < > 0) og (fActive); ende; funksjon TShellNotification.PathFromPidl (Pidl: PItemIDList): String; begynne SetLength (Resultat, MAX_PATH); hvis ikke SHGetPathFromIDList (Pidl, PChar (resultater)) så Resultat: = ''; hvis pos (# 0, Result) > 0 da SetLength (Resultat, pos (# 0, Result)); ende; prosedyre TShellNotification.SetActive (konst Verdi: Boolean); begynne if (Value < > fActive) da begynne fActive: = verdi; hvis fActive deretter ShellNotifyRegister annet ShellNotifyUnregister; end, end, prosedyre TShellNotification.SetPath (konst Verdi: String); begynne hvis fPath < > Verdi deretter begynne fPath: = verdi; ShellNotifyRegister; end, end, prosedyre TShellNotification.SetWatch (konst Verdi: Boolean); begynne hvis fWatch < > Verdi deretter begynne fWatch: = verdi; ShellNotifyRegister; end, end, prosedyre TShellNotification.SetWatchEvents (konst Verdi: TNotificationEvents); begynne hvis fWatchEvents < > Verdi deretter begynne fWatchEvents: = verdi; ShellNotifyRegister; end, end, prosedyre TShellNotification.ShellNotifyRegister; Var Alternativ: TNotificationEvent; NotifyRecord: NOTIFYREGISTER; Flags: DWORD; Pidl: PItemIDList; Attributter: ULONG; const NotifyFlags: array [TNotificationEvent] av DWORD = (SHCNE_ASSOCCHANGED, SHCNE_ATTRIBUTES, SHCNE_UPDATEITEM, SHCNE_CREATE, SHCNE_DELETE, SHCNE_RENAMEITEM, SHCNE_DRIVEADD, SHCNE_DRIVEREMOVED, SHCNE_DRIVEADDGUI, SHCNE_FREESPACE, SHCNE_MEDIAINSERTED, SHCNE_MEDIAREMOVED, SHCNE_MKDIR, SHCNE_RMDIR, SHCNE_RENAMEFOLDER, SHCNE_UPDATEDIR, SHCNE_NETSHARE, SHCNE_NETUNSHARE , SHCNE_SERVERDISCONNECT, SHCNE_UPDATEIMAGE); begynne ShellNotifyUnregister; hvis ikke (csDesigning i ComponentState) og ikke (csLoading i ComponentState) da begynne SHILCreatefromPath (PChar (fPath), adr (Pidl), attributter); NotifyRecord.pidlPath: = Pidl; NotifyRecord.bWatchSubtree: = fWatch; Flags: = 0; for Alternativ: = Low (tilleggsutstyr) til høy (tilleggsutstyr) gjør if (Option i FWatchEvents) deretter Flags: = Flags eller NotifyFlags [alternativ]; NotifyHandle: = SHChangeNotifyRegister (Håndtak, SHCNF_ACCEPT_INTERRUPTS eller SHCNF_ACCEPT_NON_INTERRUPTS, Flagg, SNM_SHELLNOTIFICATION, 1,NotifyRecord); end, end, prosedyre TShellNotification.ShellNotifyUnregister; begynne hvis NotifyHandle < > 0 da SHChangeNotifyDeregister (NotifyHandle); ende; prosedyre TShellNotification.WndProc (var Melding: TMessage) -typen TPIDLLIST = rekord pidlist: array [1..2] av PITEMIDLIST; slutt; PIDARRAY = ^ TPIDLLIST; Var STI1: string; Path2: string; PTR: PIDARRAY; gjentas: boolean; hendelse: longint; begynne tilfelle Message.Msg av SNM_SHELLNOTIFICATION: begynne event: = Message.LParam og ($ 7FFFFFFF); Ptr: = PIDARRAY (Message.WParam); STI1: = PathFromPidl (Ptr ^ .pidlist [1]); Path2: = PathFromPidl (Ptr ^ .pidList [2]); gjentas: = (PrevEvent = hendelse) og (store bokstaver (prevpath1) = store bokstaver (STI1)) og (store bokstaver (prevpath2) = store bokstaver (path2)); hvis Gjentatt og avslutter; PrevEvent: = Message.Msg; prevPath1: = STI1; prevPath2: = path2; Ved eventuell SHCNE_ASSOCCHANGED: DoAssociationChange; SHCNE_ATTRIBUTES: DoAttributesChange (STI1, path2); SHCNE_CREATE: DoCreateFile (STI1); SHCNE_DELETE: DoDeleteFile (STI1); SHCNE_DRIVEADD: DoDriveAdd (STI1); SHCNE_DRIVEADDGUI: DoDriveAddGui (STI1); SHCNE_DRIVEREMOVED: DoDriveRemove (STI1); SHCNE_MEDIAINSERTED: DoMediaInsert (STI1); SHCNE_MEDIAREMOVED: DoMediaRemove (STI1); SHCNE_MKDIR: DoDirCreate (STI1); SHCNE_NETSHARE: DoNetShare (STI1); SHCNE_NETUNSHARE: DoNetUnShare (STI1); SHCNE_RENAMEFOLDER: DoRenameFolder (STI1, path2); SHCNE_RENAMEITEM: DoRenameItem (STI1, path2); SHCNE_RMDIR: DoFolderRemove (STI1); SHCNE_SERVERDISCONNECT: DoServerDisconnect (Sti); SHCNE_UPDATEDIR: DoDirUpdate (Sti); SHCNE_UPDATEIMAGE:; SHCNE_UPDATEITEM:; end; //Veske Ved slutten; //SNM_SHELLNOTIFICATION slutten; //caseend; prosedyre Registrer; begynne RegisterComponents ('Shell', [TShellNotification]); end; slutt. < ------------------ End Unit Kode ---- ---------------------- > Ekstrautstyr spørsmål et al, vennligst send en kommentar eller e-post:) Takk til Willian Egge for rapportering av bugs og tilbyr en løsning rundt em :)



Previous:
Next Page: