Obtenir des notifications à partir du shell


Comment faire pour accrocher à la coque interne de l'événement de déclenchement
Si vous avez jamais besoin de savoir, quand la coquille questions d'un événement est un wrapper autour de SHChangeNotifyRegister qui vous permet de connaître la nature de l'événement et le ou les fichier(s) affectée, ce composant se trouve dans la phase 1 de développement mais elle offre l'ensemble des fonctionnalités.
Le composant lui-même est composé de l'amélioration de TSHChangeNotify composant par Elliott Shevin ([email protected])
Par la façon dont voici une liste de choses que vous devez être conscient lors de l'utilisation de ce composant, par exemple la restauration d'un élément de la corbeille à l'emplacement d'origine de tourner sur un changement de nom de l'événement, tandis que vous obtenez une notification par rapport à un événement, vous ne pouvez pas arrêter ce que vous venez de faire connaissance.
la Suppression d'un Élément causes de 3 événements: OnFileDelete (Lorsque la boîte de dialogue, ou de l'absence d', est affiché normalement c'est avant la suppression du fichier) un OnFolderUpdate (après l'élément est supprimé et le dossier actualise) et surprise encore une autre OnFileDelete (après que le fichier a été complètement supprimé) ce problème n'est pas de la partie mais de l'api, il s'appuie sur.
Aussi, selon certains documents, j'ai lu les api utilisées sur cet article sont entièrement sans-papiers, peut-être, il peut être possible de mettre fin à l'événement mais en raison du manque de documentation, il m'est inconnue.
< & & & & & & & Commencer code d'UNITÉ de & & & & & & & & & & & & & & >
{$IFNDEF VER80} {$IFNDEF VER90} {$IFNDEF VER93}
& nbsp & nbsp {$DEFINE Delphi3orHigher}
{$ENDIF} {$ENDIF} {$ENDIF}
unité de ShellNotify
interface
utilise Windows, Messages, SysUtils, Les Classes, les Contrôles, les Formes, les Dialogues,
& nbsp & nbsp {$IFNDEF Delphi3orHigher} OLE2, {$ELSE} ActiveX, ComObj, {$ENDIF}
& nbsp & nbsp ShlObj
type
& nbsp & nbsp NOTIFYREGISTER = enregistrement
& ! & ! & ! & nbsp pidlPath : PItemIDList
& ! & ! & ! & nbsp bWatchSubtree : boolean
& nbsp & nbsp fin
& nbsp & nbsp PNOTIFYREGISTER = ^NOTIFYREGISTER
const
& nbsp & nbsp SNM_SHELLNOTIFICATION = WM_USER 1
& nbsp & nbsp SHCNF_ACCEPT_INTERRUPTS = $0001
& nbsp & nbsp SHCNF_ACCEPT_NON_INTERRUPTS = $0002
& nbsp & nbsp SHCNF_NO_PROXY = $8000
type
& nbsp & nbsp TNotificationEvent = (neAssociationChange, neAttributesChange,
& ! & ! & ! & nbsp neFileChange, neFileCreate, neFileDelete, neFileRename,
& ! & ! & ! & nbsp neDriveAdd, neDriveRemove, neShellDriveAdd, neDriveSpaceChange,
& ! & ! & ! & nbsp neMediaInsert, neMediaRemove, neFolderCreate, neFolderDelete,
& ! & ! & ! & nbsp neFolderRename, neFolderUpdate, neNetShare, neNetUnShare,
& ! & ! & ! & nbsp neServerDisconnect, neImageListChange)
& nbsp & nbsp TNotificationEvents = ensemble de TNotificationEvent
& nbsp & nbsp TShellNotificationEvent1 = procédure(Sender: TObject
& ! & ! & ! & nbsp Chemin: String)de l'Objet
& nbsp & nbsp TShellNotificationEvent2 = procédure(Sender: TObject
& ! & ! & ! & nbsp path1, chemin2: String) de l'Objet
& nbsp & nbsp TShellNotification = class(TComponent)
& nbsp & nbsp privé
& ! & ! & ! & nbsp fWatchEvents: TNotificationEvents
& ! & ! & ! & nbsp fPath: String
& ! & ! & ! & nbsp fActive, fWatch: Boolean
& ! & ! & ! & nbsp prevPath1, prevPath2: String
& ! & ! & ! & nbsp PrevEvent: Entier
& ! & ! & ! & nbsp Poignée, NotifyHandle: HWND
& ! & ! & ! & nbsp fOnAssociationChange: TNotifyEvent
& ! & ! & ! & nbsp fOnAttribChange: TShellNotificationEvent2
& ! & ! & ! & nbsp FOnCreate: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnDelete: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnDriveAdd: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnDriveAddGui: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnDriveRemove: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnMediaInsert: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnMediaRemove: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnDirCreate: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnNetShare: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnNetUnShare: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnRenameFolder: TShellNotificationEvent2
& ! & ! & ! & nbsp FOnItemRename: TShellNotificationEvent2
& ! & ! & ! & nbsp FOnFolderRemove: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnServerDisconnect: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnFolderUpdate: TShellNotificationEvent1
& ! & ! & ! & nbsp fonction PathFromPidl(Pidl: PItemIDList): String
& ! & ! & ! & nbsp procédure SetWatchEvents(const Value: TNotificationEvents)
& ! & ! & ! & nbsp fonction Coordonné: Boolean
& ! & ! & ! & nbsp procédure SetActive(const Value: Boolean)
& ! & ! & ! & nbsp procédure SetPath(const Value: String)
& ! & ! & ! & nbsp procédure SetWatch(const Value: Boolean)
& nbsp & nbsp protégé
& ! & ! & ! & nbsp procédure ShellNotifyRegister
& ! & ! & ! & nbsp procédure ShellNotifyUnregister
& ! & ! & ! & nbsp procédure WndProc(var Message: TMessage)
& ! & ! & ! & nbsp procédure DoAssociationChange dynamique
& ! & ! & ! & nbsp procédure DoAttributesChange(Chemin1, Chemin2: String) dynamique
& ! & ! & ! & nbsp procédure DoCreateFile(Chemin d'accès: String) dynamique
& ! & ! & ! & nbsp procédure DoDeleteFile(Chemin d'accès: String) dynamique
& ! & ! & ! & nbsp procédure DoDriveAdd(Chemin d'accès:String) dynamique
& ! & ! & ! & nbsp procédure DoDriveAddGui(Chemin d'accès: String) dynamique
& ! & ! & ! & nbsp procédure DoDriveRemove(Chemin d'accès: String) dynamique
& ! & ! & ! & nbsp procédure DoMediaInsert(Chemin d'accès: String) dynamique
& ! & ! & ! & nbsp procédure DoMediaRemove(Chemin d'accès: String) dynamique
& ! & ! & ! & nbsp procédure DoDirCreate(Chemin d'accès: String) dynamique
& ! & ! & ! & nbsp procédure DoNetShare(Chemin d'accès: String) dynamique
& ! & ! & ! & nbsp procédure DoNetUnShare(Chemin d'accès: String) dynamique
& ! & ! & ! & nbsp procédure DoRenameFolder(Chemin1, Chemin2: String) dynamique
& ! & ! & ! & nbsp procédure DoRenameItem(Chemin1, Chemin2: String) dynamique
& ! & ! & ! & nbsp procédure DoFolderRemove(Chemin d'accès: String) dynamique
& ! & ! & ! & nbsp procédure DoServerDisconnect(Chemin d'accès: String) dynamique
& ! & ! & ! & nbsp procédure DoDirUpdate(Chemin d'accès: String) dynamique
& nbsp & nbsp public
& ! & ! & ! & nbsp constructor Create(AOwner: TComponent) remplacer
& ! & ! & ! & nbsp destructeur de Détruire remplacer
& nbsp & nbsp publié
& ! & ! & ! & nbsp Chemin de la propriété: Chaîne de lecture fPath écrire SetPath
& ! & ! & ! & nbsp propriété Active: Boolean lire Coordonné écrire SetActive
& ! & ! & ! & nbsp propriété WatchSubTree: Boolean lire fWatch écrire SetWatch
& ! & ! & ! & nbsp propriété WatchEvents: TNotificationEvents
& ! & ! & ! & nbsp lire fWatchEvents écrire SetWatchEvents
& ! & ! & ! & nbsp propriété OnAssociationChange: TNotifyEvent
& ! & ! & ! & nbsp lire fOnAssociationChange écrire FOnAssociationChange
& ! & ! & ! & nbsp propriété OnAttributesChange: TShellNotificationEvent2
& ! & ! & ! & nbsp lire fOnAttribChange écrire fOnAttribChange
& ! & ! & ! & nbsp propriété OnFileCreate: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnCreate écrire FOnCreate
& ! & ! & ! & nbsp propriété OnFolderRename: TShellNotificationEvent2
& ! & ! & ! & nbsp lire FOnRenameFolder écrire FOnRenameFolder
& ! & ! & ! & nbsp propriété OnFolderUpdate: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnFolderUpdate écrire FOnFolderUpdate
& ! & ! & ! & nbsp propriété OnFileDelete: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnDelete écrire FOnDelete
& ! & ! & ! & nbsp propriété OnDriveAdd: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnDriveAdd écrire FOnDriveAdd
& ! & ! & ! & nbsp propriété OnFolderRemove: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnFolderRemove écrire FOnFolderRemove
& ! & ! & ! & nbsp propriété OnItemRename: TShellNotificationEvent2
& ! & ! & ! & nbsp lire FOnItemRename écrire FOnItemRename
& ! & ! & ! & nbsp propriété OnDriveAddGui: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnDriveAddGui écrire FOnDriveAddGui
& ! & ! & ! & nbsp propriété OnDriveRemove: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnDriveRemove écrire FOnDriveRemove
& ! & ! & ! & nbsp propriété OnMediaInserted: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnMediaInsert écrire FOnMediaInsert
& ! & ! & ! & nbsp propriété OnMediaRemove: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnMediaRemove écrire FOnMediaRemove
& ! & ! & ! & nbsp propriété OnDirCreate: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnDirCreate écrire FOnDirCreate
& ! & ! & ! & nbsp propriété OnNetShare: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnNetShare écrire FOnNetShare
& ! & ! & ! & nbsp propriété OnNetUnShare: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnNetUnShare écrire FOnNetUnShare
& ! & ! & ! & nbsp propriété OnServerDisconnect: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnServerDisconnect écrire FOnServerDisconnect
& nbsp & nbsp fin
& nbsp & nbsp fonction SHChangeNotifyRegister( hWnd: HWND dwFlags: integer
& ! & ! & ! & ! & ! & ! & nbsp wEventMask : le cardinal uMsg: UINT cItems : integer
& ! & ! & ! & ! & ! & ! & nbsp lpItems : PNOTIFYREGISTER) : HWND stdcall
& nbsp & nbsp fonction SHChangeNotifyDeregister(hWnd: HWND) : boolean stdcall
& nbsp & nbsp fonction SHILCreateFromPath(Chemin d'accès: Pointeur PIDL: PItemIDList
& ! & ! & ! & ! & ! & nbsp var Attributs: ULONG):HResult stdcall
& nbsp & nbsp procédure Register
application
const Shell32DLL = 'shell32.dll'
& nbsp & nbsp fonction SHChangeNotifyRegister externe Shell32DLL indice 2
& nbsp & nbsp fonction SHChangeNotifyDeregister externe Shell32DLL indice 4
& nbsp & nbsp fonction SHILCreateFromPath externe Shell32DLL index 28
{ TShellNotification }
constructeur TShellNotification.Create(AOwner: TComponent)
begin
& nbsp & nbsp hérité Create( AOwner )
& nbsp & nbsp si ce n' (csDesigning dans ComponentState)
& ! & ! & ! & nbsp Poignée := AllocateHWnd(WndProc)
& nbsp & nbsp PrevEvent := 0
& nbsp & nbsp fWatchEvents := [neAssociationChange, neAttributesChange,
& ! & ! & ! & nbsp neFileChange, neFileCreate, neFileDelete, neFileRename,
& ! & ! & ! & nbsp neDriveAdd, neDriveRemove, neShellDriveAdd, neDriveSpaceChange,
& ! & ! & ! & nbsp neMediaInsert, neMediaRemove, neFolderCreate, neFolderDelete,
& ! & ! & ! & nbsp neFolderRename, neFolderUpdate, neNetShare, neNetUnShare,
& ! & ! & ! & nbsp neServerDisconnect, neImageListChange]
fin
destructeur TShellNotification.Détruire
begin

& nbsp & nbsp si ce n' (csDesigning dans ComponentState)
& ! & ! & ! & nbsp Active := False
& nbsp & nbsp si la Poignée <> 0 alors DeallocateHWnd( Manche )
& nbsp & nbsp hérité de Détruire
fin
procédure TShellNotification.DoAssociationChange
begin
& nbsp & nbsp si Affecté( fOnAssociationChange ) et (neAssociationChange dans fWatchEvents)
& ! & ! & ! & nbsp fOnAssociationChange( Auto )
fin
procédure TShellNotification.DoAttributesChange
begin
& nbsp & nbsp si Affecté( fOnAttribChange )
& ! & ! & ! & nbsp fOnAttribChange( Auto, Chemin1, Chemin2 )
fin
procédure TShellNotification.DoCreateFile(Chemin d'accès: String)
begin
& nbsp & nbsp si Affecté( fOnCreate )
& ! & ! & ! & nbsp FOnCreate(Auto, Chemin)
fin
procédure TShellNotification.DoDeleteFile(Chemin d'accès: String)
begin
& nbsp & nbsp si Affecté( FOnDelete )
& ! & ! & ! & nbsp FOnDelete(Auto, Chemin)
fin
procédure TShellNotification.DoDirCreate(Chemin d'accès: String)
begin
& nbsp & nbsp si Affecté( FOnDirCreate )
& ! & ! & ! & nbsp FOnDirCreate( Auto, Chemin )
fin
procédure TShellNotification.DoDirUpdate(Chemin d'accès: String)
begin
& nbsp & nbsp si Affecté( FOnFolderUpdate )
& ! & ! & ! & nbsp FOnFolderUpdate(Auto, Chemin)
fin
procédure TShellNotification.DoDriveAdd(Chemin d'accès: String)
begin
& nbsp & nbsp si Affecté( FOnDriveAdd )
& ! & ! & ! & nbsp FOnDriveAdd(Auto, Chemin)
fin
procédure TShellNotification.DoDriveAddGui(Chemin d'accès: String)
begin
& nbsp & nbsp si Affecté( FOnDriveAddGui )
& ! & ! & ! & nbsp FOnDriveAdd(Auto, Chemin)
fin
procédure TShellNotification.DoDriveRemove(Chemin d'accès: String)
begin
& nbsp & nbsp si Affecté( FOnDriveRemove )
& ! & ! & ! & nbsp FOnDriveRemove(Auto, Chemin)
fin
procédure TShellNotification.DoFolderRemove(Chemin d'accès: String)
begin
& nbsp & nbsp si Affecté(FOnFolderRemove)
& ! & ! & ! & nbsp FOnFolderRemove( Auto, Chemin )
fin
procédure TShellNotification.DoMediaInsert(Chemin d'accès: String)
begin
& nbsp & nbsp si Affecté( FOnMediaInsert )
& ! & ! & ! & nbsp FOnMediaInsert(Auto, Chemin)
fin
procédure TShellNotification.DoMediaRemove(Chemin d'accès: String)
begin
& nbsp & nbsp si Affecté(FOnMediaRemove)
& ! & ! & ! & nbsp FOnMediaRemove(Auto, Chemin)
fin
procédure TShellNotification.DoNetShare(Chemin d'accès: String)
begin
& nbsp & nbsp si Affecté(FOnNetShare)
& ! & ! & ! & nbsp FOnNetShare(Auto, Chemin)
fin
procédure TShellNotification.DoNetUnShare(Chemin d'accès: String)
begin
& nbsp & nbsp si Affecté(FOnNetUnShare)
& ! & ! & ! & nbsp FOnNetUnShare(Auto, Chemin)
fin
procédure TShellNotification.DoRenameFolder(Chemin1, Chemin2: String)
begin
& nbsp & nbsp si Affecté( FOnRenameFolder )
& ! & ! & ! & nbsp FOnRenameFolder(Auto, Chemin1, Chemin2)
fin
procédure TShellNotification.DoRenameItem(Chemin1, Chemin2: String)
begin
& nbsp & nbsp si Affecté( FOnItemRename )
& ! & ! & ! & nbsp FonItemRename(Auto, Chemin1, Chemin2)
fin
procédure TShellNotification.DoServerDisconnect(Chemin d'accès: String)
begin
& nbsp & nbsp si Affecté( FOnServerDisconnect )
& ! & ! & ! & nbsp FOnServerDisconnect(Auto, Chemin)
fin
fonction de TShellNotification.Coordonné: Boolean
begin
& nbsp & nbsp Result := (NotifyHandle <> 0) et (fActive)
fin
fonction de TShellNotification.PathFromPidl(Pidl: PItemIDList): String
begin
& nbsp & nbsp SetLength(Résultat, Max_Path)
& nbsp & nbsp si pas SHGetPathFromIDList(Pidl, PChar(Suite)) then Result := '
& nbsp & nbsp si pos(#0, Résultat) > 0, alors
& ! & ! & ! & nbsp SetLength(Résultat, pos(#0, Resultat))
fin
procédure TShellNotification.SetActive(const Value: Boolean)
begin
& nbsp & nbsp if (Valeur <> fActive)
& nbsp & nbsp commencer
& ! & ! & ! & nbsp fActive := Valeur
& ! & ! & ! & nbsp si fActive puis ShellNotifyRegister d'autre ShellNotifyUnregister
& nbsp & nbsp fin
fin
procédure TShellNotification.SetPath(const Value: String)
begin
& nbsp & nbsp si fPath <> Valeur
& nbsp & nbsp commencer
& ! & ! & ! & nbsp fPath := Valeur
& ! & ! & ! & nbsp ShellNotifyRegister
& nbsp & nbsp fin
fin
procédure TShellNotification.SetWatch(const Value: Boolean)
begin
& nbsp & nbsp si fWatch <> Valeur
& nbsp & nbsp commencer
& ! & ! & ! & nbsp fWatch := Valeur
& nbsp nbsp & & nbsp & nbsp ShellNotifyRegister
& nbsp & nbsp fin
fin
procédure TShellNotification.SetWatchEvents(
& nbsp & nbsp const Value: TNotificationEvents)
begin
& nbsp & nbsp si fWatchEvents <> Valeur
& nbsp & nbsp commencer
& ! & ! & ! & nbsp fWatchEvents := Valeur
& ! & ! & ! & nbsp ShellNotifyRegister
& nbsp & nbsp fin
fin
procédure TShellNotification.ShellNotifyRegister
var
& nbsp & nbsp Option: TNotificationEvent
& nbsp & nbsp NotifyRecord: NOTIFYREGISTER
& nbsp & nbsp Drapeaux: DWORD
& nbsp & nbsp Pidl: PItemIDList
& nbsp & nbsp Attributs: ULONG
const
& nbsp & nbsp NotifyFlags: array[TNotificationEvent] de DWORD = (
& ! & ! & ! & nbsp SHCNE_ASSOCCHANGED, SHCNE_ATTRIBUTES, SHCNE_UPDATEITEM,
& ! & ! & ! & nbsp SHCNE_CREATE, SHCNE_DELETE, SHCNE_RENAMEITEM, SHCNE_DRIVEADD,
& ! & ! & ! & nbsp SHCNE_DRIVEREMOVED, SHCNE_DRIVEADDGUI, SHCNE_FREESPACE,
& ! & ! & ! & nbsp SHCNE_MEDIAINSERTED, SHCNE_MEDIAREMOVED, SHCNE_MKDIR,
& ! & ! & ! & nbsp SHCNE_RMDIR, SHCNE_RENAMEFOLDER, SHCNE_UPDATEDIR,
& ! & ! & ! & nbsp SHCNE_NETSHARE, SHCNE_NETUNSHARE, SHCNE_SERVERDISCONNECT,
& ! & ! & ! & nbsp SHCNE_UPDATEIMAGE)
begin
& nbsp & nbsp ShellNotifyUnregister
& nbsp & nbsp si ce n' (csDesigning dans ComponentState) et
& ! & ! & ! & ! & nbsp pas (csLoading dans ComponentState)
& nbsp & nbsp commencer
& ! & ! & ! & nbsp SHILCreatefromPath( PChar(fPath), Addr(Pidl), Attributs)
& ! & ! & ! & nbsp NotifyRecord.pidlPath := Pidl
& ! & ! & ! & nbsp NotifyRecord.bWatchSubtree := fWatch
& ! & ! & ! & nbsp Drapeaux := 0
& ! & ! & ! & nbsp pour l'Option := min(Option) Haute(Option) ne
& ! & ! & ! & ! & ! & nbsp si (Option FWatchEvents)
& ! & ! & ! & ! & ! & ! & ! & nbsp Drapeaux := Drapeaux ou NotifyFlags[Option]
& ! & ! & ! & nbsp NotifyHandle := SHChangeNotifyRegister(Poignée,
& ! & ! & ! & ! & ! & nbsp SHCNF_ACCEPT_INTERRUPTS ou SHCNF_ACCEPT_NON_INTERRUPTS,
& ! & ! & ! & ! & ! & nbsp Drapeaux, SNM_SHELLNOTIFICATION, 1, @NotifyRecord)
& nbsp & nbsp fin
fin
procédure TShellNotification.ShellNotifyUnregister
begin
& nbsp & nbsp si NotifyHandle <> 0 then
& ! & ! & ! & nbsp SHChangeNotifyDeregister(NotifyHandle)
fin
procédure TShellNotification.WndProc(var Message: TMessage)
type
& nbsp & nbsp & nbsp TPIDLLIST = enregistrement
& ! & ! & ! & ! & ! & nbsp pidlist : array[1..2] de PITEMIDLIST
& nbsp & nbsp & nbsp fin
& nbsp & nbsp & nbsp PIDARRAY = ^TPIDLLIST
var
& nbsp & nbsp & nbsp Path1 : string
& nbsp & nbsp & nbsp Chemin2 : string
& nbsp & nbsp & nbsp ptr : PIDARRAY
& nbsp & nbsp & nbsp répété : boolean
& nbsp & nbsp & nbsp événement : longint
begin
& nbsp & nbsp cas de Message.Msg
& ! & ! & ! & nbsp SNM_SHELLNOTIFICATION:
& ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & nbsp événement := Message.LParam et ($7FFFFFFF)
& ! & ! & ! & ! & ! & nbsp Ptr := PIDARRAY(Message.WParam)
& ! & ! & ! & ! & ! & nbsp Path1 := PathFromPidl( Ptr^.pidlist[1] )
& ! & ! & ! & ! & ! & nbsp Chemin2 := PathFromPidl( Ptr^.pidList[2] )
& ! & ! & ! & ! & ! & nbsp répété := (PrevEvent = événement)
& ! & ! & ! & ! & ! & ! & ! & nbsp et (en majuscules(prevpath1) = majuscule(Chemin1))
& ! & ! & ! & ! & ! & ! & ! & nbsp et (en majuscules(prevpath2) = majuscule(Chemin2))
& ! & ! & ! & ! & ! & nbsp si elle est Répétée, puis la sortie
& ! & ! & ! & ! & ! & nbsp PrevEvent := Message.Msg
& ! & ! & ! & ! & ! & nbsp prevPath1 := Path1
& ! & ! & ! & ! & ! & nbsp prevPath2 := Path2
& ! & ! & ! & ! & ! & nbsp cas d'événement de
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_ASSOCCHANGED : DoAssociationChange
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_ATTRIBUTES : DoAttributesChange( Chemin1, Chemin2)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_CREATE : DoCreateFile(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_DELETE : DoDeleteFile(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_DRIVEADD : DoDriveAdd(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_DRIVEADDGUI : DoDriveAddGui(chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_DRIVEREMOVED : DoDriveRemove(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_MEDIAINSERTED : DoMediaInsert(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_MEDIAREMOVED : DoMediaRemove(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_MKDIR : DoDirCreate(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_NETSHARE : DoNetShare(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_NETUNSHARE : DoNetUnShare(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_RENAMEFOLDER : DoRenameFolder(Chemin1, Chemin2)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_RENAMEITEM : DoRenameItem(Chemin1, Chemin2)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_RMDIR : DoFolderRemove(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_SERVERDISCONNECT : DoServerDisconnect(Chemin)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_UPDATEDIR : DoDirUpdate(Chemin)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_UPDATEIMAGE :
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_UPDATEITEM :
& ! & ! & ! & ! & ! & nbsp fin //Cas d'événement de
& ! & ! & ! & nbsp fin //SNM_SHELLNOTIFICATION
& nbsp & nbsp fin //
fin
procédure Register
begin
& nbsp & nbsp RegisterComponents ('Shell', [TShellNotification])
fin
à la fin.
< & & & & & & & & & Fin de l'Unité de Code & & & & & & & & & & & & & >
Améliorations de questions et al, merci de laisser un commentaire ou par email :)
Merci pour Willian Egge pour les rapports de bogues et d'offrir une solution autour em :)









Obtenir des notifications a partir du shell


Obtenir des notifications a partir du shell : Plusieurs milliers de conseils pour vous faciliter la vie.


Comment faire pour accrocher a la coque interne de l'evenement de declenchement
Si vous avez jamais besoin de savoir, quand la coquille questions d'un evenement est un wrapper autour de SHChangeNotifyRegister qui vous permet de connaître la nature de l'evenement et le ou les fichier(s) affectee, ce composant se trouve dans la phase 1 de developpement mais elle offre l'ensemble des fonctionnalites.
Le composant lui-meme est compose de l'amelioration de TSHChangeNotify composant par Elliott Shevin ([email protected])
Par la façon dont voici une liste de choses que vous devez etre conscient lors de l'utilisation de ce composant, par exemple la restauration d'un element de la corbeille a l'emplacement d'origine de tourner sur un changement de nom de l'evenement, tandis que vous obtenez une notification par rapport a un evenement, vous ne pouvez pas arreter ce que vous venez de faire connaissance.
la Suppression d'un Element causes de 3 evenements: OnFileDelete (Lorsque la boîte de dialogue, ou de l'absence d', est affiche normalement c'est avant la suppression du fichier) un OnFolderUpdate (apres l'element est supprime et le dossier actualise) et surprise encore une autre OnFileDelete (apres que le fichier a ete completement supprime) ce probleme n'est pas de la partie mais de l'api, il s'appuie sur.
Aussi, selon certains documents, j'ai lu les api utilisees sur cet article sont entierement sans-papiers, peut-etre, il peut etre possible de mettre fin a l'evenement mais en raison du manque de documentation, il m'est inconnue.
< & & & & & & & Commencer code d'UNITE de & & & & & & & & & & & & & & >
{$IFNDEF VER80} {$IFNDEF VER90} {$IFNDEF VER93}
& nbsp & nbsp {$DEFINE Delphi3orHigher}
{$ENDIF} {$ENDIF} {$ENDIF}
unite de ShellNotify
interface
utilise Windows, Messages, SysUtils, Les Classes, les Controles, les Formes, les Dialogues,
& nbsp & nbsp {$IFNDEF Delphi3orHigher} OLE2, {$ELSE} ActiveX, ComObj, {$ENDIF}
& nbsp & nbsp ShlObj
type
& nbsp & nbsp NOTIFYREGISTER = enregistrement
& ! & ! & ! & nbsp pidlPath : PItemIDList
& ! & ! & ! & nbsp bWatchSubtree : boolean
& nbsp & nbsp fin
& nbsp & nbsp PNOTIFYREGISTER = ^NOTIFYREGISTER
const
& nbsp & nbsp SNM_SHELLNOTIFICATION = WM_USER 1
& nbsp & nbsp SHCNF_ACCEPT_INTERRUPTS = $0001
& nbsp & nbsp SHCNF_ACCEPT_NON_INTERRUPTS = $0002
& nbsp & nbsp SHCNF_NO_PROXY = $8000
type
& nbsp & nbsp TNotificationEvent = (neAssociationChange, neAttributesChange,
& ! & ! & ! & nbsp neFileChange, neFileCreate, neFileDelete, neFileRename,
& ! & ! & ! & nbsp neDriveAdd, neDriveRemove, neShellDriveAdd, neDriveSpaceChange,
& ! & ! & ! & nbsp neMediaInsert, neMediaRemove, neFolderCreate, neFolderDelete,
& ! & ! & ! & nbsp neFolderRename, neFolderUpdate, neNetShare, neNetUnShare,
& ! & ! & ! & nbsp neServerDisconnect, neImageListChange)
& nbsp & nbsp TNotificationEvents = ensemble de TNotificationEvent
& nbsp & nbsp TShellNotificationEvent1 = procedure(Sender: TObject
& ! & ! & ! & nbsp Chemin: String)de l'Objet
& nbsp & nbsp TShellNotificationEvent2 = procedure(Sender: TObject
& ! & ! & ! & nbsp path1, chemin2: String) de l'Objet
& nbsp & nbsp TShellNotification = class(TComponent)
& nbsp & nbsp prive
& ! & ! & ! & nbsp fWatchEvents: TNotificationEvents
& ! & ! & ! & nbsp fPath: String
& ! & ! & ! & nbsp fActive, fWatch: Boolean
& ! & ! & ! & nbsp prevPath1, prevPath2: String
& ! & ! & ! & nbsp PrevEvent: Entier
& ! & ! & ! & nbsp Poignee, NotifyHandle: HWND
& ! & ! & ! & nbsp fOnAssociationChange: TNotifyEvent
& ! & ! & ! & nbsp fOnAttribChange: TShellNotificationEvent2
& ! & ! & ! & nbsp FOnCreate: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnDelete: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnDriveAdd: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnDriveAddGui: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnDriveRemove: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnMediaInsert: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnMediaRemove: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnDirCreate: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnNetShare: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnNetUnShare: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnRenameFolder: TShellNotificationEvent2
& ! & ! & ! & nbsp FOnItemRename: TShellNotificationEvent2
& ! & ! & ! & nbsp FOnFolderRemove: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnServerDisconnect: TShellNotificationEvent1
& ! & ! & ! & nbsp FOnFolderUpdate: TShellNotificationEvent1
& ! & ! & ! & nbsp fonction PathFromPidl(Pidl: PItemIDList): String
& ! & ! & ! & nbsp procedure SetWatchEvents(const Value: TNotificationEvents)
& ! & ! & ! & nbsp fonction Coordonne: Boolean
& ! & ! & ! & nbsp procedure SetActive(const Value: Boolean)
& ! & ! & ! & nbsp procedure SetPath(const Value: String)
& ! & ! & ! & nbsp procedure SetWatch(const Value: Boolean)
& nbsp & nbsp protege
& ! & ! & ! & nbsp procedure ShellNotifyRegister
& ! & ! & ! & nbsp procedure ShellNotifyUnregister
& ! & ! & ! & nbsp procedure WndProc(var Message: TMessage)
& ! & ! & ! & nbsp procedure DoAssociationChange dynamique
& ! & ! & ! & nbsp procedure DoAttributesChange(Chemin1, Chemin2: String) dynamique
& ! & ! & ! & nbsp procedure DoCreateFile(Chemin d'acces: String) dynamique
& ! & ! & ! & nbsp procedure DoDeleteFile(Chemin d'acces: String) dynamique
& ! & ! & ! & nbsp procedure DoDriveAdd(Chemin d'acces:String) dynamique
& ! & ! & ! & nbsp procedure DoDriveAddGui(Chemin d'acces: String) dynamique
& ! & ! & ! & nbsp procedure DoDriveRemove(Chemin d'acces: String) dynamique
& ! & ! & ! & nbsp procedure DoMediaInsert(Chemin d'acces: String) dynamique
& ! & ! & ! & nbsp procedure DoMediaRemove(Chemin d'acces: String) dynamique
& ! & ! & ! & nbsp procedure DoDirCreate(Chemin d'acces: String) dynamique
& ! & ! & ! & nbsp procedure DoNetShare(Chemin d'acces: String) dynamique
& ! & ! & ! & nbsp procedure DoNetUnShare(Chemin d'acces: String) dynamique
& ! & ! & ! & nbsp procedure DoRenameFolder(Chemin1, Chemin2: String) dynamique
& ! & ! & ! & nbsp procedure DoRenameItem(Chemin1, Chemin2: String) dynamique
& ! & ! & ! & nbsp procedure DoFolderRemove(Chemin d'acces: String) dynamique
& ! & ! & ! & nbsp procedure DoServerDisconnect(Chemin d'acces: String) dynamique
& ! & ! & ! & nbsp procedure DoDirUpdate(Chemin d'acces: String) dynamique
& nbsp & nbsp public
& ! & ! & ! & nbsp constructor Create(AOwner: TComponent) remplacer
& ! & ! & ! & nbsp destructeur de Detruire remplacer
& nbsp & nbsp publie
& ! & ! & ! & nbsp Chemin de la propriete: Chaîne de lecture fPath ecrire SetPath
& ! & ! & ! & nbsp propriete Active: Boolean lire Coordonne ecrire SetActive
& ! & ! & ! & nbsp propriete WatchSubTree: Boolean lire fWatch ecrire SetWatch
& ! & ! & ! & nbsp propriete WatchEvents: TNotificationEvents
& ! & ! & ! & nbsp lire fWatchEvents ecrire SetWatchEvents
& ! & ! & ! & nbsp propriete OnAssociationChange: TNotifyEvent
& ! & ! & ! & nbsp lire fOnAssociationChange ecrire FOnAssociationChange
& ! & ! & ! & nbsp propriete OnAttributesChange: TShellNotificationEvent2
& ! & ! & ! & nbsp lire fOnAttribChange ecrire fOnAttribChange
& ! & ! & ! & nbsp propriete OnFileCreate: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnCreate ecrire FOnCreate
& ! & ! & ! & nbsp propriete OnFolderRename: TShellNotificationEvent2
& ! & ! & ! & nbsp lire FOnRenameFolder ecrire FOnRenameFolder
& ! & ! & ! & nbsp propriete OnFolderUpdate: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnFolderUpdate ecrire FOnFolderUpdate
& ! & ! & ! & nbsp propriete OnFileDelete: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnDelete ecrire FOnDelete
& ! & ! & ! & nbsp propriete OnDriveAdd: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnDriveAdd ecrire FOnDriveAdd
& ! & ! & ! & nbsp propriete OnFolderRemove: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnFolderRemove ecrire FOnFolderRemove
& ! & ! & ! & nbsp propriete OnItemRename: TShellNotificationEvent2
& ! & ! & ! & nbsp lire FOnItemRename ecrire FOnItemRename
& ! & ! & ! & nbsp propriete OnDriveAddGui: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnDriveAddGui ecrire FOnDriveAddGui
& ! & ! & ! & nbsp propriete OnDriveRemove: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnDriveRemove ecrire FOnDriveRemove
& ! & ! & ! & nbsp propriete OnMediaInserted: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnMediaInsert ecrire FOnMediaInsert
& ! & ! & ! & nbsp propriete OnMediaRemove: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnMediaRemove ecrire FOnMediaRemove
& ! & ! & ! & nbsp propriete OnDirCreate: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnDirCreate ecrire FOnDirCreate
& ! & ! & ! & nbsp propriete OnNetShare: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnNetShare ecrire FOnNetShare
& ! & ! & ! & nbsp propriete OnNetUnShare: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnNetUnShare ecrire FOnNetUnShare
& ! & ! & ! & nbsp propriete OnServerDisconnect: TShellNotificationEvent1
& ! & ! & ! & nbsp lire FOnServerDisconnect ecrire FOnServerDisconnect
& nbsp & nbsp fin
& nbsp & nbsp fonction SHChangeNotifyRegister( hWnd: HWND dwFlags: integer
& ! & ! & ! & ! & ! & ! & nbsp wEventMask : le cardinal uMsg: UINT cItems : integer
& ! & ! & ! & ! & ! & ! & nbsp lpItems : PNOTIFYREGISTER) : HWND stdcall
& nbsp & nbsp fonction SHChangeNotifyDeregister(hWnd: HWND) : boolean stdcall
& nbsp & nbsp fonction SHILCreateFromPath(Chemin d'acces: Pointeur PIDL: PItemIDList
& ! & ! & ! & ! & ! & nbsp var Attributs: ULONG):HResult stdcall
& nbsp & nbsp procedure Register
application
const Shell32DLL = 'shell32.dll'
& nbsp & nbsp fonction SHChangeNotifyRegister externe Shell32DLL indice 2
& nbsp & nbsp fonction SHChangeNotifyDeregister externe Shell32DLL indice 4
& nbsp & nbsp fonction SHILCreateFromPath externe Shell32DLL index 28
{ TShellNotification }
constructeur TShellNotification.Create(AOwner: TComponent)
begin
& nbsp & nbsp herite Create( AOwner )
& nbsp & nbsp si ce n' (csDesigning dans ComponentState)
& ! & ! & ! & nbsp Poignee := AllocateHWnd(WndProc)
& nbsp & nbsp PrevEvent := 0
& nbsp & nbsp fWatchEvents := [neAssociationChange, neAttributesChange,
& ! & ! & ! & nbsp neFileChange, neFileCreate, neFileDelete, neFileRename,
& ! & ! & ! & nbsp neDriveAdd, neDriveRemove, neShellDriveAdd, neDriveSpaceChange,
& ! & ! & ! & nbsp neMediaInsert, neMediaRemove, neFolderCreate, neFolderDelete,
& ! & ! & ! & nbsp neFolderRename, neFolderUpdate, neNetShare, neNetUnShare,
& ! & ! & ! & nbsp neServerDisconnect, neImageListChange]
fin
destructeur TShellNotification.Detruire
begin

& nbsp & nbsp si ce n' (csDesigning dans ComponentState)
& ! & ! & ! & nbsp Active := False
& nbsp & nbsp si la Poignee <> 0 alors DeallocateHWnd( Manche )
& nbsp & nbsp herite de Detruire
fin
procedure TShellNotification.DoAssociationChange
begin
& nbsp & nbsp si Affecte( fOnAssociationChange ) et (neAssociationChange dans fWatchEvents)
& ! & ! & ! & nbsp fOnAssociationChange( Auto )
fin
procedure TShellNotification.DoAttributesChange
begin
& nbsp & nbsp si Affecte( fOnAttribChange )
& ! & ! & ! & nbsp fOnAttribChange( Auto, Chemin1, Chemin2 )
fin
procedure TShellNotification.DoCreateFile(Chemin d'acces: String)
begin
& nbsp & nbsp si Affecte( fOnCreate )
& ! & ! & ! & nbsp FOnCreate(Auto, Chemin)
fin
procedure TShellNotification.DoDeleteFile(Chemin d'acces: String)
begin
& nbsp & nbsp si Affecte( FOnDelete )
& ! & ! & ! & nbsp FOnDelete(Auto, Chemin)
fin
procedure TShellNotification.DoDirCreate(Chemin d'acces: String)
begin
& nbsp & nbsp si Affecte( FOnDirCreate )
& ! & ! & ! & nbsp FOnDirCreate( Auto, Chemin )
fin
procedure TShellNotification.DoDirUpdate(Chemin d'acces: String)
begin
& nbsp & nbsp si Affecte( FOnFolderUpdate )
& ! & ! & ! & nbsp FOnFolderUpdate(Auto, Chemin)
fin
procedure TShellNotification.DoDriveAdd(Chemin d'acces: String)
begin
& nbsp & nbsp si Affecte( FOnDriveAdd )
& ! & ! & ! & nbsp FOnDriveAdd(Auto, Chemin)
fin
procedure TShellNotification.DoDriveAddGui(Chemin d'acces: String)
begin
& nbsp & nbsp si Affecte( FOnDriveAddGui )
& ! & ! & ! & nbsp FOnDriveAdd(Auto, Chemin)
fin
procedure TShellNotification.DoDriveRemove(Chemin d'acces: String)
begin
& nbsp & nbsp si Affecte( FOnDriveRemove )
& ! & ! & ! & nbsp FOnDriveRemove(Auto, Chemin)
fin
procedure TShellNotification.DoFolderRemove(Chemin d'acces: String)
begin
& nbsp & nbsp si Affecte(FOnFolderRemove)
& ! & ! & ! & nbsp FOnFolderRemove( Auto, Chemin )
fin
procedure TShellNotification.DoMediaInsert(Chemin d'acces: String)
begin
& nbsp & nbsp si Affecte( FOnMediaInsert )
& ! & ! & ! & nbsp FOnMediaInsert(Auto, Chemin)
fin
procedure TShellNotification.DoMediaRemove(Chemin d'acces: String)
begin
& nbsp & nbsp si Affecte(FOnMediaRemove)
& ! & ! & ! & nbsp FOnMediaRemove(Auto, Chemin)
fin
procedure TShellNotification.DoNetShare(Chemin d'acces: String)
begin
& nbsp & nbsp si Affecte(FOnNetShare)
& ! & ! & ! & nbsp FOnNetShare(Auto, Chemin)
fin
procedure TShellNotification.DoNetUnShare(Chemin d'acces: String)
begin
& nbsp & nbsp si Affecte(FOnNetUnShare)
& ! & ! & ! & nbsp FOnNetUnShare(Auto, Chemin)
fin
procedure TShellNotification.DoRenameFolder(Chemin1, Chemin2: String)
begin
& nbsp & nbsp si Affecte( FOnRenameFolder )
& ! & ! & ! & nbsp FOnRenameFolder(Auto, Chemin1, Chemin2)
fin
procedure TShellNotification.DoRenameItem(Chemin1, Chemin2: String)
begin
& nbsp & nbsp si Affecte( FOnItemRename )
& ! & ! & ! & nbsp FonItemRename(Auto, Chemin1, Chemin2)
fin
procedure TShellNotification.DoServerDisconnect(Chemin d'acces: String)
begin
& nbsp & nbsp si Affecte( FOnServerDisconnect )
& ! & ! & ! & nbsp FOnServerDisconnect(Auto, Chemin)
fin
fonction de TShellNotification.Coordonne: Boolean
begin
& nbsp & nbsp Result := (NotifyHandle <> 0) et (fActive)
fin
fonction de TShellNotification.PathFromPidl(Pidl: PItemIDList): String
begin
& nbsp & nbsp SetLength(Resultat, Max_Path)
& nbsp & nbsp si pas SHGetPathFromIDList(Pidl, PChar(Suite)) then Result := '
& nbsp & nbsp si pos(#0, Resultat) > 0, alors
& ! & ! & ! & nbsp SetLength(Resultat, pos(#0, Resultat))
fin
procedure TShellNotification.SetActive(const Value: Boolean)
begin
& nbsp & nbsp if (Valeur <> fActive)
& nbsp & nbsp commencer
& ! & ! & ! & nbsp fActive := Valeur
& ! & ! & ! & nbsp si fActive puis ShellNotifyRegister d'autre ShellNotifyUnregister
& nbsp & nbsp fin
fin
procedure TShellNotification.SetPath(const Value: String)
begin
& nbsp & nbsp si fPath <> Valeur
& nbsp & nbsp commencer
& ! & ! & ! & nbsp fPath := Valeur
& ! & ! & ! & nbsp ShellNotifyRegister
& nbsp & nbsp fin
fin
procedure TShellNotification.SetWatch(const Value: Boolean)
begin
& nbsp & nbsp si fWatch <> Valeur
& nbsp & nbsp commencer
& ! & ! & ! & nbsp fWatch := Valeur
& nbsp nbsp & & nbsp & nbsp ShellNotifyRegister
& nbsp & nbsp fin
fin
procedure TShellNotification.SetWatchEvents(
& nbsp & nbsp const Value: TNotificationEvents)
begin
& nbsp & nbsp si fWatchEvents <> Valeur
& nbsp & nbsp commencer
& ! & ! & ! & nbsp fWatchEvents := Valeur
& ! & ! & ! & nbsp ShellNotifyRegister
& nbsp & nbsp fin
fin
procedure TShellNotification.ShellNotifyRegister
var
& nbsp & nbsp Option: TNotificationEvent
& nbsp & nbsp NotifyRecord: NOTIFYREGISTER
& nbsp & nbsp Drapeaux: DWORD
& nbsp & nbsp Pidl: PItemIDList
& nbsp & nbsp Attributs: ULONG
const
& nbsp & nbsp NotifyFlags: array[TNotificationEvent] de DWORD = (
& ! & ! & ! & nbsp SHCNE_ASSOCCHANGED, SHCNE_ATTRIBUTES, SHCNE_UPDATEITEM,
& ! & ! & ! & nbsp SHCNE_CREATE, SHCNE_DELETE, SHCNE_RENAMEITEM, SHCNE_DRIVEADD,
& ! & ! & ! & nbsp SHCNE_DRIVEREMOVED, SHCNE_DRIVEADDGUI, SHCNE_FREESPACE,
& ! & ! & ! & nbsp SHCNE_MEDIAINSERTED, SHCNE_MEDIAREMOVED, SHCNE_MKDIR,
& ! & ! & ! & nbsp SHCNE_RMDIR, SHCNE_RENAMEFOLDER, SHCNE_UPDATEDIR,
& ! & ! & ! & nbsp SHCNE_NETSHARE, SHCNE_NETUNSHARE, SHCNE_SERVERDISCONNECT,
& ! & ! & ! & nbsp SHCNE_UPDATEIMAGE)
begin
& nbsp & nbsp ShellNotifyUnregister
& nbsp & nbsp si ce n' (csDesigning dans ComponentState) et
& ! & ! & ! & ! & nbsp pas (csLoading dans ComponentState)
& nbsp & nbsp commencer
& ! & ! & ! & nbsp SHILCreatefromPath( PChar(fPath), Addr(Pidl), Attributs)
& ! & ! & ! & nbsp NotifyRecord.pidlPath := Pidl
& ! & ! & ! & nbsp NotifyRecord.bWatchSubtree := fWatch
& ! & ! & ! & nbsp Drapeaux := 0
& ! & ! & ! & nbsp pour l'Option := min(Option) Haute(Option) ne
& ! & ! & ! & ! & ! & nbsp si (Option FWatchEvents)
& ! & ! & ! & ! & ! & ! & ! & nbsp Drapeaux := Drapeaux ou NotifyFlags[Option]
& ! & ! & ! & nbsp NotifyHandle := SHChangeNotifyRegister(Poignee,
& ! & ! & ! & ! & ! & nbsp SHCNF_ACCEPT_INTERRUPTS ou SHCNF_ACCEPT_NON_INTERRUPTS,
& ! & ! & ! & ! & ! & nbsp Drapeaux, SNM_SHELLNOTIFICATION, 1, @NotifyRecord)
& nbsp & nbsp fin
fin
procedure TShellNotification.ShellNotifyUnregister
begin
& nbsp & nbsp si NotifyHandle <> 0 then
& ! & ! & ! & nbsp SHChangeNotifyDeregister(NotifyHandle)
fin
procedure TShellNotification.WndProc(var Message: TMessage)
type
& nbsp & nbsp & nbsp TPIDLLIST = enregistrement
& ! & ! & ! & ! & ! & nbsp pidlist : array[1..2] de PITEMIDLIST
& nbsp & nbsp & nbsp fin
& nbsp & nbsp & nbsp PIDARRAY = ^TPIDLLIST
var
& nbsp & nbsp & nbsp Path1 : string
& nbsp & nbsp & nbsp Chemin2 : string
& nbsp & nbsp & nbsp ptr : PIDARRAY
& nbsp & nbsp & nbsp repete : boolean
& nbsp & nbsp & nbsp evenement : longint
begin
& nbsp & nbsp cas de Message.Msg
& ! & ! & ! & nbsp SNM_SHELLNOTIFICATION:
& ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & nbsp evenement := Message.LParam et ($7FFFFFFF)
& ! & ! & ! & ! & ! & nbsp Ptr := PIDARRAY(Message.WParam)
& ! & ! & ! & ! & ! & nbsp Path1 := PathFromPidl( Ptr^.pidlist[1] )
& ! & ! & ! & ! & ! & nbsp Chemin2 := PathFromPidl( Ptr^.pidList[2] )
& ! & ! & ! & ! & ! & nbsp repete := (PrevEvent = evenement)
& ! & ! & ! & ! & ! & ! & ! & nbsp et (en majuscules(prevpath1) = majuscule(Chemin1))
& ! & ! & ! & ! & ! & ! & ! & nbsp et (en majuscules(prevpath2) = majuscule(Chemin2))
& ! & ! & ! & ! & ! & nbsp si elle est Repetee, puis la sortie
& ! & ! & ! & ! & ! & nbsp PrevEvent := Message.Msg
& ! & ! & ! & ! & ! & nbsp prevPath1 := Path1
& ! & ! & ! & ! & ! & nbsp prevPath2 := Path2
& ! & ! & ! & ! & ! & nbsp cas d'evenement de
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_ASSOCCHANGED : DoAssociationChange
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_ATTRIBUTES : DoAttributesChange( Chemin1, Chemin2)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_CREATE : DoCreateFile(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_DELETE : DoDeleteFile(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_DRIVEADD : DoDriveAdd(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_DRIVEADDGUI : DoDriveAddGui(chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_DRIVEREMOVED : DoDriveRemove(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_MEDIAINSERTED : DoMediaInsert(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_MEDIAREMOVED : DoMediaRemove(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_MKDIR : DoDirCreate(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_NETSHARE : DoNetShare(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_NETUNSHARE : DoNetUnShare(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_RENAMEFOLDER : DoRenameFolder(Chemin1, Chemin2)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_RENAMEITEM : DoRenameItem(Chemin1, Chemin2)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_RMDIR : DoFolderRemove(Chemin1)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_SERVERDISCONNECT : DoServerDisconnect(Chemin)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_UPDATEDIR : DoDirUpdate(Chemin)
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_UPDATEIMAGE :
& ! & ! & ! & ! & ! & ! & ! & nbsp SHCNE_UPDATEITEM :
& ! & ! & ! & ! & ! & nbsp fin //Cas d'evenement de
& ! & ! & ! & nbsp fin //SNM_SHELLNOTIFICATION
& nbsp & nbsp fin //
fin
procedure Register
begin
& nbsp & nbsp RegisterComponents ('Shell', [TShellNotification])
fin
a la fin.
< & & & & & & & & & Fin de l'Unite de Code & & & & & & & & & & & & & >
Ameliorations de questions et al, merci de laisser un commentaire ou par email :)
Merci pour Willian Egge pour les rapports de bogues et d'offrir une solution autour em :)


Obtenir des notifications à partir du shell

Obtenir des notifications à partir du shell : Plusieurs milliers de conseils pour vous faciliter la vie.
Recommander aux amis
  • gplus
  • pinterest

Messages récents

Commentaire

Laisser un commentaire

évaluation