Abrufen von Benachrichtigungen aus der shell


Wie auf der Schale internes Ereignis auslösen einbinden
Wenn Sie schon immer wissen, wann die Schale-Aspekte, die hier ein Ereignis ist ein Wrapper um SHChangeNotifyRegister Wich Sie die Art des Ereignisses und die Datei(en), die betroffenen wissen, diese Komponente in Phase 1 der Entwicklung ist mussten jedoch bietet es die gesamte Funktionalität.
Die Komponente selbst besteht aus Verbesserungen an TSHChangeNotify Komponente Elliott Shevin (als [email protected])
Übrigens ist hier eine Liste der Dinge, die Sie berücksichtigen sollten, wenn mit dieser Komponente z. B. Wiederherstellen ein Element aus dem Papierkorb auf den ursprünglichen Speicherort Einschalten ein Ereignis umbenennen während Sie eine Benachrichtigung über ein Ereignis erhalten, die Sie können nicht es beenden, die Sie gerade davon benachrichtigt.
Löschen eines Elements werden 3 Ereignisse: OnFileDelete (wenn der Dialog oder die mangelnde wird normalerweise angezeigt dies ist vor dem Löschen der Datei) eine OnFolderUpdate (nachdem das Element entfernt wurde und die Ordner aktualisiert) und überraschen noch eine OnFileDelete (nachdem die Datei vollständig gelöscht wurde) ist dieses Verhalten nicht der Komponente, sondern der API, die es stützt sich auf.
Auch nach einigen Dokumentation Lese ich, dass die auf diesem Artikel verwendeten apis völlig undokumentiert sind, vielleicht es ist möglich, das Ereignis jedoch aufgrund mangelnder Dokumentation zu stoppen, es ist mir unbekannt.
<------> Einheit beginnen Code
{$IFNDEF VER80} {$IFNDEF VER90} {$IFNDEF VER93}
{$DEFINE Delphi3orHigher}
{$ENDIF} {$ENDIF} {$ENDIF}
Einheit ShellNotify;
Schnittstelle
verwendet Windows, Nachrichten, SysUtils, Klassen, Steuerelemente, Formulare, Dialoge,
{$IFNDEF Delphi3orHigher} OLE2, {$ELSE} ActiveX, ComObj, {$ENDIF}
ShlObj;
Typ
NOTIFYREGISTER = Datensatz
PidlPath: PItemIDList;
bWatchSubtree: boolean;
Ende;
PNOTIFYREGISTER = ^ NOTIFYREGISTER;
const
SNM_SHELLNOTIFICATION = WM_USER + 1;
SHCNF_ACCEPT_INTERRUPTS = $0001;
SHCNF_ACCEPT_NON_INTERRUPTS = $0002;
SHCNF_NO_PROXY = $8000;
Typ
TNotificationEvent = (NeAssociationChange, NeAttributesChange,
NeFileChange, NeFileCreate, NeFileDelete, NeFileRename,
NeDriveAdd, NeDriveRemove, NeShellDriveAdd, NeDriveSpaceChange,
NeMediaInsert, NeMediaRemove, NeFolderCreate, NeFolderDelete,
NeFolderRename, NeFolderUpdate, NeNetShare, NeNetUnShare,
NeServerDisconnect, NeImageListChange);
TNotificationEvents = Satz von TNotificationEvent;
TShellNotificationEvent1 = Prozedur (Sender: TObject;
Pfad: String) des Objekts;
TShellNotificationEvent2 = Prozedur (Sender: TObject;
path1, path2: String) des Objekts;
TShellNotification = class(TComponent)
Private
fWatchEvents: TNotificationEvents;
Validierungsoption: String;
fActive, fWatch: Boolean;
prevPath1, prevPath2: String;
PrevEvent: Integer;
Griff, 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;
Funktion PathFromPidl(Pidl: PItemIDList): String;
Procedure SetWatchEvents (const Value: TNotificationEvents);
Funktion GetActive: Boolean;
Procedure SetActive (const Value: Boolean);
Verfahren SetPath (const Value: String);
Procedure SetWatch (const Value: Boolean);
geschützt
Prozedur ShellNotifyRegister;
Prozedur ShellNotifyUnregister;
Prozedur WndProc (Var Message: TMessage);
Prozedur DoAssociationChange; dynamische;
Prozedur DoAttributesChange (Path1, Path2: String); dynamische;
Prozedur DoCreateFile(Path: String); dynamische;
Prozedur DoDeleteFile(Path: String); dynamische;
Prozedur DoDriveAdd(Path:String); dynamische;
Prozedur DoDriveAddGui(Path: String); dynamische;
Prozedur DoDriveRemove(Path: String); dynamische;
Prozedur DoMediaInsert(Path: String); dynamische;
Prozedur DoMediaRemove(Path: String); dynamische;
Prozedur DoDirCreate(Path: String); dynamische;
Prozedur DoNetShare(Path: String); dynamische;
Prozedur DoNetUnShare(Path: String); dynamische;
Prozedur DoRenameFolder (Path1, Path2: String); dynamische;
Prozedur DoRenameItem (Path1, Path2: String); dynamische;
Prozedur DoFolderRemove(Path: String); dynamische;
Prozedur DoServerDisconnect(Path: String); dynamische;
Prozedur DoDirUpdate(Path: String); dynamische;
öffentliche
Konstruktor Create(AOwner: TComponent); außer Kraft setzen;
Destruktor Destroy; außer Kraft setzen;
veröffentlicht
die Eigenschaft Path: String lesen Validierungsoption schreiben SetPath;
Eigenschaft aktiv: Boolean Read GetActive schreiben SetActive;
Eigenschaft WatchSubTree: Boolean lesen fWatch schreiben SetWatch;
Eigenschaft WatchEvents: TNotificationEvents
Lesen Sie fWatchEvents schreiben SetWatchEvents;
Eigenschaft OnAssociationChange: TNotifyEvent
Lesen Sie fOnAssociationChange schreiben FOnAssociationChange;
Eigenschaft OnAttributesChange: TShellNotificationEvent2
Lesen Sie fOnAttribChange schreiben fOnAttribChange;
Eigenschaft OnFileCreate: TShellNotificationEvent1
Lesen Sie FOnCreate schreiben FOnCreate;
Eigenschaft OnFolderRename: TShellNotificationEvent2
Lesen Sie FOnRenameFolder schreiben FOnRenameFolder;
Eigenschaft OnFolderUpdate: TShellNotificationEvent1
Lesen Sie FOnFolderUpdate schreiben FOnFolderUpdate;
Eigenschaft OnFileDelete: TShellNotificationEvent1
Lesen Sie FOnDelete schreiben FOnDelete;
Eigenschaft OnDriveAdd: TShellNotificationEvent1
Lesen Sie FOnDriveAdd schreiben FOnDriveAdd;
Eigenschaft OnFolderRemove: TShellNotificationEvent1
Lesen Sie FOnFolderRemove schreiben FOnFolderRemove;
Eigenschaft OnItemRename: TShellNotificationEvent2
Lesen Sie FOnItemRename schreiben FOnItemRename;
Eigenschaft OnDriveAddGui: TShellNotificationEvent1
Lesen Sie FOnDriveAddGui schreiben FOnDriveAddGui;
Eigenschaft OnDriveRemove: TShellNotificationEvent1
Lesen Sie FOnDriveRemove schreiben FOnDriveRemove;
Eigenschaft OnMediaInserted: TShellNotificationEvent1
Lesen Sie FOnMediaInsert schreiben FOnMediaInsert;
Eigenschaft OnMediaRemove: TShellNotificationEvent1
Lesen Sie FOnMediaRemove schreiben FOnMediaRemove;
Eigenschaft OnDirCreate: TShellNotificationEvent1
Lesen Sie FOnDirCreate schreiben FOnDirCreate;
Eigenschaft OnNetShare: TShellNotificationEvent1
Lesen Sie FOnNetShare schreiben FOnNetShare;
Eigenschaft OnNetUnShare: TShellNotificationEvent1
Lesen Sie FOnNetUnShare schreiben FOnNetUnShare;
Eigenschaft OnServerDisconnect: TShellNotificationEvent1
Lesen Sie FOnServerDisconnect schreiben FOnServerDisconnect;
Ende;
Funktion SHChangeNotifyRegister (hWnd: HWND; DwFlags: Ganzzahl;
wEventMask: Kardinal; uMsg: UINT; cItems: Integer;
LpItems: PNOTIFYREGISTER): HWND; Stdcall;
& nbsp Funktion SHChangeNotifyDeregister(hWnd: HWND): boolean; Stdcall;
Funktion SHILCreateFromPath (Pfad: Pointer; PIDL: PItemIDList;
Var-Attribute: ULONG): HResult; Stdcall;
Register des Verfahrens;
Umsetzung
const Shell32DLL = 'shell32.dll';
Funktion SHChangeNotifyRegister; externe Shell32DLL Index 2;
Funktion SHChangeNotifyDeregister; externe Shell32DLL Index 4;
Funktion SHILCreateFromPath; externe Shell32DLL Index 28;
{TShellNotification}
Konstruktor TShellNotification.Create(AOwner: TComponent);
beginnen
geerbte erstellen (AOwner);
Wenn nicht (CsDesigning in ComponentState) dann
Behandeln: = 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;
Destruktor TShellNotification.Destroy;
beginnen

Wenn nicht (CsDesigning in ComponentState) dann
Aktive: = False;
Wenn verarbeiten <> 0 dann DeallocateHWnd (Handle);
geerbte Destroy;
Ende;
Prozedur TShellNotification.DoAssociationChange;
beginnen
Wenn zugewiesen (fOnAssociationChange) und (NeAssociationChange in fWatchEvents) dann
fOnAssociationChange (selbst);
Ende;
Prozedur TShellNotification.DoAttributesChange;
beginnen
Wenn dann zugewiesen (fOnAttribChange)
fOnAttribChange (Self, Path1, Path2);
Ende;
Prozedur TShellNotification.DoCreateFile(Path: String);
beginnen
Wenn dann zugewiesen (fOnCreate)
FOnCreate (Self, Pfad)
Ende;
Prozedur TShellNotification.DoDeleteFile(Path: String);
beginnen
Wenn zugewiesen (FOnDelete)
FOnDelete (Self, Pfad);
Ende;
Prozedur TShellNotification.DoDirCreate(Path: String);
beginnen
Wenn zugewiesen (FOnDirCreate)
FOnDirCreate (Self, Pfad);
Ende;
Prozedur TShellNotification.DoDirUpdate(Path: String);
beginnen
Wenn zugewiesen (FOnFolderUpdate)
FOnFolderUpdate (Self, Pfad);
Ende;
Prozedur TShellNotification.DoDriveAdd(Path: String);
beginnen
Wenn zugewiesen (FOnDriveAdd)
FOnDriveAdd (Self, Pfad);
Ende;
Prozedur TShellNotification.DoDriveAddGui(Path: String);
beginnen
Wenn zugewiesen (FOnDriveAddGui)
FOnDriveAdd (Self, Pfad);
Ende;
Prozedur TShellNotification.DoDriveRemove(Path: String);
beginnen
Wenn zugewiesen (FOnDriveRemove)
FOnDriveRemove (Self, Pfad);
Ende;
Prozedur TShellNotification.DoFolderRemove(Path: String);
beginnen
Wenn Assigned(FOnFolderRemove) dann
FOnFolderRemove (Self, Pfad);
Ende;
Prozedur TShellNotification.DoMediaInsert(Path: String);
beginnen
Wenn zugewiesen (FOnMediaInsert)
FOnMediaInsert (Self, Pfad);
Ende;
Prozedur TShellNotification.DoMediaRemove(Path: String);
beginnen
Wenn Assigned(FOnMediaRemove) dann
FOnMediaRemove (Self, Pfad);
Ende;
Prozedur TShellNotification.DoNetShare(Path: String);
beginnen
Wenn Assigned(FOnNetShare) dann
FOnNetShare (Self, Pfad);
Ende;
Prozedur TShellNotification.DoNetUnShare(Path: String);
beginnen
Wenn Assigned(FOnNetUnShare) dann
FOnNetUnShare (Self, Pfad);
Ende;
Prozedur TShellNotification.DoRenameFolder (Path1, Path2: String);
beginnen
Wenn zugewiesen (FOnRenameFolder)
FOnRenameFolder (selbst Path1, Path2);
Ende;
Prozedur TShellNotification.DoRenameItem (Path1, Path2: String);
beginnen
Wenn zugewiesen (FOnItemRename)
FonItemRename (selbst Path1, Path2);
Ende;
Prozedur TShellNotification.DoServerDisconnect(Path: String);
beginnen
Wenn zugewiesen (FOnServerDisconnect)
FOnServerDisconnect (Self, Pfad);
Ende;
Funktion TShellNotification.GetActive: Boolean;
beginnen
Ergebnis: = (NotifyHandle-<>-0) und (fActive);
Ende;
Funktion TShellNotification.PathFromPidl(Pidl: PItemIDList): String;
beginnen
SetLength (Ergebnis, Max_Path);
Wenn nicht SHGetPathFromIDList (Pidl, PChar(Result)) then Result: = '';
Wenn pos (#0, Ergebnis) > 0 dann
SetLength (Result, pos (#0, Ergebnis));
Ende;
Procedure TShellNotification.SetActive (const Value: Boolean);
beginnen
Wenn (Wert <> fActive) dann
beginnen
fActive: = Value;
Wenn fActive dann ShellNotifyRegister sonst ShellNotifyUnregister;
Ende;
Ende;
Procedure TShellNotification.SetPath (const Value: String);
beginnen
Wenn dann Validierungsoption <> Wert
beginnen
Validierungsoption: = Value;
ShellNotifyRegister;
Ende;
Ende;
Procedure TShellNotification.SetWatch (const Value: Boolean);
beginnen
Wenn dann fWatch <> Wert
beginnen
fWatch: = Value;
ShellNotifyRegister;
Ende;
Ende;
Verfahren () TShellNotification.SetWatchEvents
const-Wert: TNotificationEvents);
beginnen
Wenn dann fWatchEvents <> Wert
beginnen
fWatchEvents: = Value;
ShellNotifyRegister;
Ende;
Ende;
Prozedur TShellNotification.ShellNotifyRegister;
var
Option: TNotificationEvent;
NotifyRecord: NOTIFYREGISTER;
Flaggen: DWORD;
PIDL: PItemIDList;
Attribute: ULONG;
const
NotifyFlags: array [TNotificationEvent] 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);
beginnen
ShellNotifyUnregister;
Wenn nicht (CsDesigning in ComponentState) und
nicht (CsLoading in ComponentState) dann
beginnen
SHILCreatefromPath (PChar(fPath), Addr(Pidl), Attribute);
NotifyRecord.pidlPath: = Pidl;
NotifyRecord.bWatchSubtree: = fWatch;
Flaggen: = 0;
Unterkunft: = Low(Option) High(Option) Do
Wenn (Option im FWatchEvents) dann
Flaggen: = Flags oder NotifyFlags [Option];
NotifyHandle: = SHChangeNotifyRegister (Handle,
SHCNF_ACCEPT_INTERRUPTS oder SHCNF_ACCEPT_NON_INTERRUPTS,
Fahnen, SNM_SHELLNOTIFICATION, 1, @NotifyRecord);
Ende;
Ende;
Prozedur TShellNotification.ShellNotifyUnregister;
beginnen
Wenn NotifyHandle <> 0 dann
SHChangeNotifyDeregister(NotifyHandle);
Ende;
Procedure TShellNotification.WndProc (Var Message: TMessage);
Typ
TPIDLLIST = Datensatz
PidList: Array [1..2] von PITEMIDLIST;
Ende;
PIDARRAY = ^ TPIDLLIST;
var
Path1: String;
Path2: String;
PTR: PIDARRAY;
wiederholt: boolean;
Veranstaltung: Longint;
beginnen
Fall von Message.Msg
SNM_SHELLNOTIFICATION:
beginnen
Veranstaltung: = Message.LParam und ($7FFFFFFF);
PTR: = PIDARRAY(Message.WParam);
Path1: = PathFromPidl (Ptr ^ .pidlist [1]);
Path2: = PathFromPidl (Ptr ^ .pidList [2]);
wiederholt: = (PrevEvent = Ereignis)
und (uppercase(prevpath1) = uppercase(Path1))
und (uppercase(prevpath2) = uppercase(Path2));
Wenn wiederholen dann Ausfahrt;
PrevEvent: = Message.Msg;
prevPath1: = Path1;
prevPath2: = Path2;
RS-Ereignis
SHCNE_ASSOCCHANGED: DoAssociationChange;
SHCNE_ATTRIBUTES: DoAttributesChange (Path1, Path2);
SHCNE_CREATE: DoCreateFile(Path1);
SHCNE_DELETE: DoDeleteFile(Path1);
SHCNE_DRIVEADD: DoDriveAdd(Path1);
SHCNE_DRIVEADDGUI: DoDriveAddGui(path1);
SHCNE_DRIVEREMOVED: DoDriveRemove(Path1);
SHCNE_MEDIAINSERTED: DoMediaInsert(Path1);
SHCNE_MEDIAREMOVED: DoMediaRemove(Path1);
SHCNE_MKDIR: DoDirCreate(Path1);
SHCNE_NETSHARE: DoNetShare(Path1);
SHCNE_NETUNSHARE: DoNetUnShare(Path1);
SHCNE_RENAMEFOLDER: DoRenameFolder (Path1, Path2);
SHCNE_RENAMEITEM: DoRenameItem (Path1, Path2);
SHCNE_RMDIR: DoFolderRemove(Path1);
SHCNE_SERVERDISCONNECT: DoServerDisconnect(Path);
SHCNE_UPDATEDIR: DoDirUpdate(Path);
SHCNE_UPDATEIMAGE:;
SHCNE_UPDATEITEM:;
End; //Case-Ereignis
End; //SNM_SHELLNOTIFICATION
Ende; Fall
Ende;
Register des Verfahrens;
beginnen
RegisterComponents ('Muschel', [TShellNotification]);
Ende;
Ende.
<---Endcode Einheit--->
Verbesserungen Fragen Et al., bitte schreiben Sie einen Kommentar oder e-Mail :)
Dank Willian Egge für das Melden von Fehlern und eine Lösung um Em :)









Abrufen von Benachrichtigungen aus der shell


Abrufen von Benachrichtigungen aus der shell : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


Wie auf der Schale internes Ereignis auslösen einbinden
Wenn Sie schon immer wissen, wann die Schale-Aspekte, die hier ein Ereignis ist ein Wrapper um SHChangeNotifyRegister Wich Sie die Art des Ereignisses und die Datei(en), die betroffenen wissen, diese Komponente in Phase 1 der Entwicklung ist mussten jedoch bietet es die gesamte Funktionalität.
Die Komponente selbst besteht aus Verbesserungen an TSHChangeNotify Komponente Elliott Shevin (als [email protected])
Übrigens ist hier eine Liste der Dinge, die Sie berücksichtigen sollten, wenn mit dieser Komponente z. B. Wiederherstellen ein Element aus dem Papierkorb auf den ursprünglichen Speicherort Einschalten ein Ereignis umbenennen während Sie eine Benachrichtigung über ein Ereignis erhalten, die Sie können nicht es beenden, die Sie gerade davon benachrichtigt.
Löschen eines Elements werden 3 Ereignisse: OnFileDelete (wenn der Dialog oder die mangelnde wird normalerweise angezeigt dies ist vor dem Löschen der Datei) eine OnFolderUpdate (nachdem das Element entfernt wurde und die Ordner aktualisiert) und überraschen noch eine OnFileDelete (nachdem die Datei vollständig gelöscht wurde) ist dieses Verhalten nicht der Komponente, sondern der API, die es stützt sich auf.
Auch nach einigen Dokumentation Lese ich, dass die auf diesem Artikel verwendeten apis völlig undokumentiert sind, vielleicht es ist möglich, das Ereignis jedoch aufgrund mangelnder Dokumentation zu stoppen, es ist mir unbekannt.
<------> Einheit beginnen Code
{$IFNDEF VER80} {$IFNDEF VER90} {$IFNDEF VER93}
{$DEFINE Delphi3orHigher}
{$ENDIF} {$ENDIF} {$ENDIF}
Einheit ShellNotify;
Schnittstelle
verwendet Windows, Nachrichten, SysUtils, Klassen, Steuerelemente, Formulare, Dialoge,
{$IFNDEF Delphi3orHigher} OLE2, {$ELSE} ActiveX, ComObj, {$ENDIF}
ShlObj;
Typ
NOTIFYREGISTER = Datensatz
PidlPath: PItemIDList;
bWatchSubtree: boolean;
Ende;
PNOTIFYREGISTER = ^ NOTIFYREGISTER;
const
SNM_SHELLNOTIFICATION = WM_USER + 1;
SHCNF_ACCEPT_INTERRUPTS = $0001;
SHCNF_ACCEPT_NON_INTERRUPTS = $0002;
SHCNF_NO_PROXY = $8000;
Typ
TNotificationEvent = (NeAssociationChange, NeAttributesChange,
NeFileChange, NeFileCreate, NeFileDelete, NeFileRename,
NeDriveAdd, NeDriveRemove, NeShellDriveAdd, NeDriveSpaceChange,
NeMediaInsert, NeMediaRemove, NeFolderCreate, NeFolderDelete,
NeFolderRename, NeFolderUpdate, NeNetShare, NeNetUnShare,
NeServerDisconnect, NeImageListChange);
TNotificationEvents = Satz von TNotificationEvent;
TShellNotificationEvent1 = Prozedur (Sender: TObject;
Pfad: String) des Objekts;
TShellNotificationEvent2 = Prozedur (Sender: TObject;
path1, path2: String) des Objekts;
TShellNotification = class(TComponent)
Private
fWatchEvents: TNotificationEvents;
Validierungsoption: String;
fActive, fWatch: Boolean;
prevPath1, prevPath2: String;
PrevEvent: Integer;
Griff, 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;
Funktion PathFromPidl(Pidl: PItemIDList): String;
Procedure SetWatchEvents (const Value: TNotificationEvents);
Funktion GetActive: Boolean;
Procedure SetActive (const Value: Boolean);
Verfahren SetPath (const Value: String);
Procedure SetWatch (const Value: Boolean);
geschützt
Prozedur ShellNotifyRegister;
Prozedur ShellNotifyUnregister;
Prozedur WndProc (Var Message: TMessage);
Prozedur DoAssociationChange; dynamische;
Prozedur DoAttributesChange (Path1, Path2: String); dynamische;
Prozedur DoCreateFile(Path: String); dynamische;
Prozedur DoDeleteFile(Path: String); dynamische;
Prozedur DoDriveAdd(Path:String); dynamische;
Prozedur DoDriveAddGui(Path: String); dynamische;
Prozedur DoDriveRemove(Path: String); dynamische;
Prozedur DoMediaInsert(Path: String); dynamische;
Prozedur DoMediaRemove(Path: String); dynamische;
Prozedur DoDirCreate(Path: String); dynamische;
Prozedur DoNetShare(Path: String); dynamische;
Prozedur DoNetUnShare(Path: String); dynamische;
Prozedur DoRenameFolder (Path1, Path2: String); dynamische;
Prozedur DoRenameItem (Path1, Path2: String); dynamische;
Prozedur DoFolderRemove(Path: String); dynamische;
Prozedur DoServerDisconnect(Path: String); dynamische;
Prozedur DoDirUpdate(Path: String); dynamische;
öffentliche
Konstruktor Create(AOwner: TComponent); außer Kraft setzen;
Destruktor Destroy; außer Kraft setzen;
veröffentlicht
die Eigenschaft Path: String lesen Validierungsoption schreiben SetPath;
Eigenschaft aktiv: Boolean Read GetActive schreiben SetActive;
Eigenschaft WatchSubTree: Boolean lesen fWatch schreiben SetWatch;
Eigenschaft WatchEvents: TNotificationEvents
Lesen Sie fWatchEvents schreiben SetWatchEvents;
Eigenschaft OnAssociationChange: TNotifyEvent
Lesen Sie fOnAssociationChange schreiben FOnAssociationChange;
Eigenschaft OnAttributesChange: TShellNotificationEvent2
Lesen Sie fOnAttribChange schreiben fOnAttribChange;
Eigenschaft OnFileCreate: TShellNotificationEvent1
Lesen Sie FOnCreate schreiben FOnCreate;
Eigenschaft OnFolderRename: TShellNotificationEvent2
Lesen Sie FOnRenameFolder schreiben FOnRenameFolder;
Eigenschaft OnFolderUpdate: TShellNotificationEvent1
Lesen Sie FOnFolderUpdate schreiben FOnFolderUpdate;
Eigenschaft OnFileDelete: TShellNotificationEvent1
Lesen Sie FOnDelete schreiben FOnDelete;
Eigenschaft OnDriveAdd: TShellNotificationEvent1
Lesen Sie FOnDriveAdd schreiben FOnDriveAdd;
Eigenschaft OnFolderRemove: TShellNotificationEvent1
Lesen Sie FOnFolderRemove schreiben FOnFolderRemove;
Eigenschaft OnItemRename: TShellNotificationEvent2
Lesen Sie FOnItemRename schreiben FOnItemRename;
Eigenschaft OnDriveAddGui: TShellNotificationEvent1
Lesen Sie FOnDriveAddGui schreiben FOnDriveAddGui;
Eigenschaft OnDriveRemove: TShellNotificationEvent1
Lesen Sie FOnDriveRemove schreiben FOnDriveRemove;
Eigenschaft OnMediaInserted: TShellNotificationEvent1
Lesen Sie FOnMediaInsert schreiben FOnMediaInsert;
Eigenschaft OnMediaRemove: TShellNotificationEvent1
Lesen Sie FOnMediaRemove schreiben FOnMediaRemove;
Eigenschaft OnDirCreate: TShellNotificationEvent1
Lesen Sie FOnDirCreate schreiben FOnDirCreate;
Eigenschaft OnNetShare: TShellNotificationEvent1
Lesen Sie FOnNetShare schreiben FOnNetShare;
Eigenschaft OnNetUnShare: TShellNotificationEvent1
Lesen Sie FOnNetUnShare schreiben FOnNetUnShare;
Eigenschaft OnServerDisconnect: TShellNotificationEvent1
Lesen Sie FOnServerDisconnect schreiben FOnServerDisconnect;
Ende;
Funktion SHChangeNotifyRegister (hWnd: HWND; DwFlags: Ganzzahl;
wEventMask: Kardinal; uMsg: UINT; cItems: Integer;
LpItems: PNOTIFYREGISTER): HWND; Stdcall;
& nbsp Funktion SHChangeNotifyDeregister(hWnd: HWND): boolean; Stdcall;
Funktion SHILCreateFromPath (Pfad: Pointer; PIDL: PItemIDList;
Var-Attribute: ULONG): HResult; Stdcall;
Register des Verfahrens;
Umsetzung
const Shell32DLL = 'shell32.dll';
Funktion SHChangeNotifyRegister; externe Shell32DLL Index 2;
Funktion SHChangeNotifyDeregister; externe Shell32DLL Index 4;
Funktion SHILCreateFromPath; externe Shell32DLL Index 28;
{TShellNotification}
Konstruktor TShellNotification.Create(AOwner: TComponent);
beginnen
geerbte erstellen (AOwner);
Wenn nicht (CsDesigning in ComponentState) dann
Behandeln: = 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;
Destruktor TShellNotification.Destroy;
beginnen

Wenn nicht (CsDesigning in ComponentState) dann
Aktive: = False;
Wenn verarbeiten <> 0 dann DeallocateHWnd (Handle);
geerbte Destroy;
Ende;
Prozedur TShellNotification.DoAssociationChange;
beginnen
Wenn zugewiesen (fOnAssociationChange) und (NeAssociationChange in fWatchEvents) dann
fOnAssociationChange (selbst);
Ende;
Prozedur TShellNotification.DoAttributesChange;
beginnen
Wenn dann zugewiesen (fOnAttribChange)
fOnAttribChange (Self, Path1, Path2);
Ende;
Prozedur TShellNotification.DoCreateFile(Path: String);
beginnen
Wenn dann zugewiesen (fOnCreate)
FOnCreate (Self, Pfad)
Ende;
Prozedur TShellNotification.DoDeleteFile(Path: String);
beginnen
Wenn zugewiesen (FOnDelete)
FOnDelete (Self, Pfad);
Ende;
Prozedur TShellNotification.DoDirCreate(Path: String);
beginnen
Wenn zugewiesen (FOnDirCreate)
FOnDirCreate (Self, Pfad);
Ende;
Prozedur TShellNotification.DoDirUpdate(Path: String);
beginnen
Wenn zugewiesen (FOnFolderUpdate)
FOnFolderUpdate (Self, Pfad);
Ende;
Prozedur TShellNotification.DoDriveAdd(Path: String);
beginnen
Wenn zugewiesen (FOnDriveAdd)
FOnDriveAdd (Self, Pfad);
Ende;
Prozedur TShellNotification.DoDriveAddGui(Path: String);
beginnen
Wenn zugewiesen (FOnDriveAddGui)
FOnDriveAdd (Self, Pfad);
Ende;
Prozedur TShellNotification.DoDriveRemove(Path: String);
beginnen
Wenn zugewiesen (FOnDriveRemove)
FOnDriveRemove (Self, Pfad);
Ende;
Prozedur TShellNotification.DoFolderRemove(Path: String);
beginnen
Wenn Assigned(FOnFolderRemove) dann
FOnFolderRemove (Self, Pfad);
Ende;
Prozedur TShellNotification.DoMediaInsert(Path: String);
beginnen
Wenn zugewiesen (FOnMediaInsert)
FOnMediaInsert (Self, Pfad);
Ende;
Prozedur TShellNotification.DoMediaRemove(Path: String);
beginnen
Wenn Assigned(FOnMediaRemove) dann
FOnMediaRemove (Self, Pfad);
Ende;
Prozedur TShellNotification.DoNetShare(Path: String);
beginnen
Wenn Assigned(FOnNetShare) dann
FOnNetShare (Self, Pfad);
Ende;
Prozedur TShellNotification.DoNetUnShare(Path: String);
beginnen
Wenn Assigned(FOnNetUnShare) dann
FOnNetUnShare (Self, Pfad);
Ende;
Prozedur TShellNotification.DoRenameFolder (Path1, Path2: String);
beginnen
Wenn zugewiesen (FOnRenameFolder)
FOnRenameFolder (selbst Path1, Path2);
Ende;
Prozedur TShellNotification.DoRenameItem (Path1, Path2: String);
beginnen
Wenn zugewiesen (FOnItemRename)
FonItemRename (selbst Path1, Path2);
Ende;
Prozedur TShellNotification.DoServerDisconnect(Path: String);
beginnen
Wenn zugewiesen (FOnServerDisconnect)
FOnServerDisconnect (Self, Pfad);
Ende;
Funktion TShellNotification.GetActive: Boolean;
beginnen
Ergebnis: = (NotifyHandle-<>-0) und (fActive);
Ende;
Funktion TShellNotification.PathFromPidl(Pidl: PItemIDList): String;
beginnen
SetLength (Ergebnis, Max_Path);
Wenn nicht SHGetPathFromIDList (Pidl, PChar(Result)) then Result: = '';
Wenn pos (#0, Ergebnis) > 0 dann
SetLength (Result, pos (#0, Ergebnis));
Ende;
Procedure TShellNotification.SetActive (const Value: Boolean);
beginnen
Wenn (Wert <> fActive) dann
beginnen
fActive: = Value;
Wenn fActive dann ShellNotifyRegister sonst ShellNotifyUnregister;
Ende;
Ende;
Procedure TShellNotification.SetPath (const Value: String);
beginnen
Wenn dann Validierungsoption <> Wert
beginnen
Validierungsoption: = Value;
ShellNotifyRegister;
Ende;
Ende;
Procedure TShellNotification.SetWatch (const Value: Boolean);
beginnen
Wenn dann fWatch <> Wert
beginnen
fWatch: = Value;
ShellNotifyRegister;
Ende;
Ende;
Verfahren () TShellNotification.SetWatchEvents
const-Wert: TNotificationEvents);
beginnen
Wenn dann fWatchEvents <> Wert
beginnen
fWatchEvents: = Value;
ShellNotifyRegister;
Ende;
Ende;
Prozedur TShellNotification.ShellNotifyRegister;
var
Option: TNotificationEvent;
NotifyRecord: NOTIFYREGISTER;
Flaggen: DWORD;
PIDL: PItemIDList;
Attribute: ULONG;
const
NotifyFlags: array [TNotificationEvent] 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);
beginnen
ShellNotifyUnregister;
Wenn nicht (CsDesigning in ComponentState) und
nicht (CsLoading in ComponentState) dann
beginnen
SHILCreatefromPath (PChar(fPath), Addr(Pidl), Attribute);
NotifyRecord.pidlPath: = Pidl;
NotifyRecord.bWatchSubtree: = fWatch;
Flaggen: = 0;
Unterkunft: = Low(Option) High(Option) Do
Wenn (Option im FWatchEvents) dann
Flaggen: = Flags oder NotifyFlags [Option];
NotifyHandle: = SHChangeNotifyRegister (Handle,
SHCNF_ACCEPT_INTERRUPTS oder SHCNF_ACCEPT_NON_INTERRUPTS,
Fahnen, SNM_SHELLNOTIFICATION, 1, @NotifyRecord);
Ende;
Ende;
Prozedur TShellNotification.ShellNotifyUnregister;
beginnen
Wenn NotifyHandle <> 0 dann
SHChangeNotifyDeregister(NotifyHandle);
Ende;
Procedure TShellNotification.WndProc (Var Message: TMessage);
Typ
TPIDLLIST = Datensatz
PidList: Array [1..2] von PITEMIDLIST;
Ende;
PIDARRAY = ^ TPIDLLIST;
var
Path1: String;
Path2: String;
PTR: PIDARRAY;
wiederholt: boolean;
Veranstaltung: Longint;
beginnen
Fall von Message.Msg
SNM_SHELLNOTIFICATION:
beginnen
Veranstaltung: = Message.LParam und ($7FFFFFFF);
PTR: = PIDARRAY(Message.WParam);
Path1: = PathFromPidl (Ptr ^ .pidlist [1]);
Path2: = PathFromPidl (Ptr ^ .pidList [2]);
wiederholt: = (PrevEvent = Ereignis)
und (uppercase(prevpath1) = uppercase(Path1))
und (uppercase(prevpath2) = uppercase(Path2));
Wenn wiederholen dann Ausfahrt;
PrevEvent: = Message.Msg;
prevPath1: = Path1;
prevPath2: = Path2;
RS-Ereignis
SHCNE_ASSOCCHANGED: DoAssociationChange;
SHCNE_ATTRIBUTES: DoAttributesChange (Path1, Path2);
SHCNE_CREATE: DoCreateFile(Path1);
SHCNE_DELETE: DoDeleteFile(Path1);
SHCNE_DRIVEADD: DoDriveAdd(Path1);
SHCNE_DRIVEADDGUI: DoDriveAddGui(path1);
SHCNE_DRIVEREMOVED: DoDriveRemove(Path1);
SHCNE_MEDIAINSERTED: DoMediaInsert(Path1);
SHCNE_MEDIAREMOVED: DoMediaRemove(Path1);
SHCNE_MKDIR: DoDirCreate(Path1);
SHCNE_NETSHARE: DoNetShare(Path1);
SHCNE_NETUNSHARE: DoNetUnShare(Path1);
SHCNE_RENAMEFOLDER: DoRenameFolder (Path1, Path2);
SHCNE_RENAMEITEM: DoRenameItem (Path1, Path2);
SHCNE_RMDIR: DoFolderRemove(Path1);
SHCNE_SERVERDISCONNECT: DoServerDisconnect(Path);
SHCNE_UPDATEDIR: DoDirUpdate(Path);
SHCNE_UPDATEIMAGE:;
SHCNE_UPDATEITEM:;
End; //Case-Ereignis
End; //SNM_SHELLNOTIFICATION
Ende; Fall
Ende;
Register des Verfahrens;
beginnen
RegisterComponents ('Muschel', [TShellNotification]);
Ende;
Ende.
<---Endcode Einheit--->
Verbesserungen Fragen Et al., bitte schreiben Sie einen Kommentar oder e-Mail :)
Dank Willian Egge für das Melden von Fehlern und eine Lösung um Em :)


Abrufen von Benachrichtigungen aus der shell

Abrufen von Benachrichtigungen aus der shell : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Abrufen von Benachrichtigungen aus der shell
Wiezutun
Freunden empfehlen
  • gplus
  • pinterest

Kommentar

Einen Kommentar hinterlassen

Wertung