Obtención de notificaciones desde el shell


Cómo conectar a la carcasa interna evento desencadenante
Si alguna vez has necesitado saber cuando el shell problemas de un evento aquí es un contenedor SHChangeNotifyRegister que permite conocer el tipo de evento y el archivo(s) afectado, este componente está en la etapa 1 de desarrollo sin embargo, ofrece la funcionalidad completa.
El componente en sí se compone de las mejoras realizadas en TSHChangeNotify componente por Elliott Shevin ([email protected])
Por cierto aquí está una lista de cosas que usted debe tener en cuenta al utilizar este componente, por ejemplo la restauración de un elemento de la papelera de reciclaje a la ubicación original encender cambiar el nombre de un evento, mientras que usted recibe una notificación sobre un evento, usted no puede dejar de que usted acaba de recibir una notificación de la misma.
la Eliminación de un Elemento hace 3 eventos: OnFileDelete (Cuando el cuadro de diálogo, o la falta de, se muestra normalmente esto es antes de la eliminación del archivo) un OnFolderUpdate (después de que el elemento se elimina y la carpeta se actualiza) y sorpresa otra OnFileDelete (después de que el archivo ha sido completamente eliminado) este comportamiento no es del componente, sino de la api se basa en.
de acuerdo a la documentación que he leído de la api que se utiliza en este artículo son totalmente indocumentados, tal vez puede ser posible para detener el evento, sin embargo debido a la falta de documentación, es desconocido para mí.
< & & & & & & & Comenzar código de la UNIDAD & & & & & & & & & & & & & & >
{$IFNDEF VER80} {$IFNDEF VER90} {$IFNDEF VER93}
& nbsp & nbsp {$DEFINE Delphi3orHigher}
{$ENDIF} {$ENDIF} {$ENDIF}
unidad de ShellNotify
interfaz
utiliza Windows, Messages, SysUtils, Clases, Controles, Formularios, cuadros de diálogo,
& nbsp & nbsp {$IFNDEF Delphi3orHigher} OLE2, {$ELSE} ActiveX, ComObj, {$ENDIF}
& nbsp & nbsp ShlObj
tipo
& nbsp & nbsp NOTIFYREGISTER = record
& nbsp & nbsp & nbsp & nbsp pidlPath : PItemIDList
& nbsp & nbsp & nbsp & nbsp bWatchSubtree : boolean
& nbsp & nbsp final
& 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
tipo
& nbsp & nbsp TNotificationEvent = (neAssociationChange, neAttributesChange,
& nbsp & nbsp & nbsp & nbsp neFileChange, neFileCreate, neFileDelete, neFileRename,
& nbsp & nbsp & nbsp & nbsp neDriveAdd, neDriveRemove, neShellDriveAdd, neDriveSpaceChange,
& nbsp & nbsp & nbsp & nbsp neMediaInsert, neMediaRemove, neFolderCreate, neFolderDelete,
& nbsp & nbsp & nbsp & nbsp neFolderRename, neFolderUpdate, neNetShare, neNetUnShare,
& nbsp & nbsp & nbsp & nbsp neServerDisconnect, neImageListChange)
& nbsp & nbsp TNotificationEvents = conjunto de TNotificationEvent
& nbsp & nbsp TShellNotificationEvent1 = procedimiento(Sender: TObject
& nbsp & nbsp & nbsp & nbsp Ruta: String)del Objeto
& nbsp & nbsp TShellNotificationEvent2 = procedimiento(Sender: TObject
& nbsp & nbsp & nbsp & nbsp ruta1, ruta2: String) del Objeto
& nbsp & nbsp TShellNotification = clase(TComponent)
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp fWatchEvents: TNotificationEvents
& nbsp & nbsp & nbsp & nbsp fPath: String
& nbsp & nbsp & nbsp & nbsp fActive, fWatch: Boolean
& nbsp & nbsp & nbsp & nbsp prevPath1, prevPath2: String
& nbsp & nbsp & nbsp & nbsp PrevEvent: Integer
& nbsp & nbsp & nbsp & nbsp Manejar, NotifyHandle: HWND
& nbsp & nbsp & nbsp & nbsp fOnAssociationChange: TNotifyEvent
& nbsp & nbsp & nbsp & nbsp fOnAttribChange: TShellNotificationEvent2
& nbsp & nbsp & nbsp & nbsp FOnCreate: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnDelete: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnDriveAdd: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnDriveAddGui: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnDriveRemove: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnMediaInsert: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnMediaRemove: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnDirCreate: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnNetShare: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnNetUnShare: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnRenameFolder: TShellNotificationEvent2
& nbsp & nbsp & nbsp & nbsp FOnItemRename: TShellNotificationEvent2
& nbsp & nbsp & nbsp & nbsp FOnFolderRemove: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnServerDisconnect: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnFolderUpdate: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp función PathFromPidl(Pidl: PItemIDList): String
& nbsp & nbsp & nbsp & nbsp procedimiento SetWatchEvents(const Value: TNotificationEvents)
& nbsp & nbsp & nbsp & nbsp función GetActive: Boolean
& nbsp & nbsp & nbsp & nbsp procedimiento SetActive(const Value: Boolean)
& nbsp & nbsp & nbsp & nbsp procedimiento SetPath(const Value: String)
& nbsp & nbsp & nbsp & nbsp procedimiento SetWatch(const Value: Boolean)
& nbsp & nbsp protegido
& nbsp & nbsp & nbsp & nbsp procedimiento ShellNotifyRegister
& nbsp & nbsp & nbsp & nbsp procedimiento ShellNotifyUnregister
& nbsp & nbsp & nbsp & nbsp procedimiento WndProc(var Message: TMessage)
& nbsp & nbsp & nbsp & nbsp procedimiento DoAssociationChange dinámico
& nbsp & nbsp & nbsp & nbsp procedimiento DoAttributesChange(Ruta1, Ruta2: String) dinámico
& nbsp & nbsp & nbsp & nbsp procedimiento DoCreateFile(Ruta: String) dinámico
& nbsp & nbsp & nbsp & nbsp procedimiento DoDeleteFile(Ruta: String) dinámico
& nbsp & nbsp & nbsp & nbsp procedimiento DoDriveAdd(Ruta:String) dinámica
& nbsp & nbsp & nbsp & nbsp procedimiento DoDriveAddGui(Ruta: String) dinámico
& nbsp & nbsp & nbsp & nbsp procedimiento DoDriveRemove(Ruta: String) dinámico
& nbsp & nbsp & nbsp & nbsp procedimiento DoMediaInsert(Ruta: String) dinámico
& nbsp & nbsp & nbsp & nbsp procedimiento DoMediaRemove(Ruta: String) dinámico
& nbsp & nbsp & nbsp & nbsp procedimiento DoDirCreate(Ruta: String) dinámica
& nbsp & nbsp & nbsp & nbsp procedimiento DoNetShare(Ruta: String) dinámico
& nbsp & nbsp & nbsp & nbsp procedimiento DoNetUnShare(Ruta: String) dinámico
& nbsp & nbsp & nbsp & nbsp procedimiento DoRenameFolder(Ruta1, Ruta2: String) dinámico
& nbsp & nbsp & nbsp & nbsp procedimiento DoRenameItem(Ruta1, Ruta2: String) dinámica
& nbsp & nbsp & nbsp & nbsp procedimiento DoFolderRemove(Ruta: String) dinámico
& nbsp & nbsp & nbsp & nbsp procedimiento DoServerDisconnect(Ruta: String) dinámico
& nbsp & nbsp & nbsp & nbsp procedimiento DoDirUpdate(Ruta: String) dinámico
& nbsp & nbsp pública
& nbsp & nbsp & nbsp & nbsp constructor Create(AOwner: TComponent) reemplazar
& nbsp & nbsp & nbsp & nbsp destructor Destruir reemplazar
& nbsp & nbsp publicado
& nbsp & nbsp & nbsp & nbsp Ruta de la propiedad: Cadena de leer fPath escribir SetPath
& nbsp & nbsp & nbsp & nbsp propiedad del Activo: Boolean leer GetActive escribir SetActive
& nbsp & nbsp & nbsp & nbsp propiedad WatchSubTree: Boolean leer fWatch escribir SetWatch
& nbsp & nbsp & nbsp & nbsp propiedad WatchEvents: TNotificationEvents
& nbsp & nbsp & nbsp & nbsp leer fWatchEvents escribir SetWatchEvents
& nbsp & nbsp & nbsp & nbsp propiedad OnAssociationChange: TNotifyEvent
& nbsp & nbsp & nbsp & nbsp leer fOnAssociationChange escribir FOnAssociationChange
& nbsp & nbsp & nbsp & nbsp propiedad OnAttributesChange: TShellNotificationEvent2
& nbsp & nbsp & nbsp & nbsp leer fOnAttribChange escribir fOnAttribChange
& nbsp & nbsp & nbsp & nbsp propiedad OnFileCreate: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnCreate escribir FOnCreate
& nbsp & nbsp & nbsp & nbsp propiedad OnFolderRename: TShellNotificationEvent2
& nbsp & nbsp & nbsp & nbsp leer FOnRenameFolder escribir FOnRenameFolder
& nbsp & nbsp & nbsp & nbsp propiedad OnFolderUpdate: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnFolderUpdate escribir FOnFolderUpdate
& nbsp & nbsp & nbsp & nbsp propiedad OnFileDelete: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnDelete escribir FOnDelete
& nbsp & nbsp & nbsp & nbsp propiedad OnDriveAdd: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnDriveAdd escribir FOnDriveAdd
& nbsp & nbsp & nbsp & nbsp propiedad OnFolderRemove: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnFolderRemove escribir FOnFolderRemove
& nbsp & nbsp & nbsp & nbsp propiedad OnItemRename: TShellNotificationEvent2
& nbsp & nbsp & nbsp & nbsp leer FOnItemRename escribir FOnItemRename
& nbsp & nbsp & nbsp & nbsp propiedad OnDriveAddGui: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnDriveAddGui escribir FOnDriveAddGui
& nbsp & nbsp & nbsp & nbsp propiedad OnDriveRemove: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnDriveRemove escribir FOnDriveRemove
& nbsp & nbsp & nbsp & nbsp propiedad OnMediaInserted: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnMediaInsert escribir FOnMediaInsert
& nbsp & nbsp & nbsp & nbsp propiedad OnMediaRemove: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnMediaRemove escribir FOnMediaRemove
& nbsp & nbsp & nbsp & nbsp propiedad OnDirCreate: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnDirCreate escribir FOnDirCreate
& nbsp & nbsp & nbsp & nbsp propiedad OnNetShare: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnNetShare escribir FOnNetShare
& nbsp & nbsp & nbsp & nbsp propiedad OnNetUnShare: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnNetUnShare escribir FOnNetUnShare
& nbsp & nbsp & nbsp & nbsp propiedad OnServerDisconnect: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnServerDisconnect escribir FOnServerDisconnect
& nbsp & nbsp final
& nbsp & nbsp función SHChangeNotifyRegister( hWnd: HWND dwFlags: integer
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp wEventMask : el cardenal uMsg: UINT cItems : integer
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp lpItems : PNOTIFYREGISTER) : HWND stdcall
& nbsp & nbsp función SHChangeNotifyDeregister(hWnd: HWND) : boolean stdcall
& nbsp & nbsp función SHILCreateFromPath(Ruta de acceso: Puntero PIDL: PItemIDList
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp var Atributos: ULONG):HResult stdcall
& nbsp & nbsp procedimiento de Registro
aplicación
const Shell32DLL = 'shell32.dll'
& nbsp & nbsp función SHChangeNotifyRegister externo Shell32DLL índice 2
& nbsp & nbsp función SHChangeNotifyDeregister externo Shell32DLL índice 4
& nbsp & nbsp función SHILCreateFromPath externo Shell32DLL índice 28
{ TShellNotification }
constructor TShellNotification.Create(AOwner: TComponent)
begin
& nbsp & nbsp inherited Create( AOwner )
& nbsp & nbsp si no (csDesigning en ComponentState), a continuación,
& nbsp & nbsp & nbsp & nbsp Identificador := AllocateHWnd(WndProc)
& nbsp & nbsp PrevEvent := 0
& nbsp & nbsp fWatchEvents := [neAssociationChange, neAttributesChange,
& nbsp & nbsp & nbsp & nbsp neFileChange, neFileCreate, neFileDelete, neFileRename,
& nbsp & nbsp & nbsp & nbsp neDriveAdd, neDriveRemove, neShellDriveAdd, neDriveSpaceChange,
& nbsp & nbsp & nbsp & nbsp neMediaInsert, neMediaRemove, neFolderCreate, neFolderDelete,
& nbsp & nbsp & nbsp & nbsp neFolderRename, neFolderUpdate, neNetShare, neNetUnShare,
& nbsp & nbsp & nbsp & nbsp neServerDisconnect, neImageListChange]
fin
destructor TShellNotification.Destruir
begin

& nbsp & nbsp si no (csDesigning en ComponentState), a continuación,
& nbsp & nbsp & nbsp & nbsp Active := False
& nbsp & nbsp si el Identificador <> 0 entonces DeallocateHWnd( Asa )
& nbsp & nbsp heredado Destruir
fin
procedimiento TShellNotification.DoAssociationChange
begin
& nbsp & nbsp si se ha Asignado( fOnAssociationChange ) y (neAssociationChange en fWatchEvents), a continuación,
& nbsp & nbsp & nbsp & nbsp fOnAssociationChange( Auto )
fin
procedimiento TShellNotification.DoAttributesChange
begin
& nbsp & nbsp si se ha Asignado( fOnAttribChange ), a continuación,
& nbsp & nbsp & nbsp & nbsp fOnAttribChange( Self, Ruta1, Ruta2 )
fin
procedimiento TShellNotification.DoCreateFile(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado( fOnCreate ), a continuación,
& nbsp & nbsp & nbsp & nbsp FOnCreate(Auto, Camino)
fin
procedimiento TShellNotification.DoDeleteFile(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado( FOnDelete ), a continuación,
& nbsp & nbsp & nbsp & nbsp FOnDelete(Auto, Camino)
fin
procedimiento TShellNotification.DoDirCreate(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado( FOnDirCreate ), a continuación,
& nbsp & nbsp & nbsp & nbsp FOnDirCreate( Auto, Camino )
fin
procedimiento TShellNotification.DoDirUpdate(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado( FOnFolderUpdate ), a continuación,
& nbsp & nbsp & nbsp & nbsp FOnFolderUpdate(Auto, Camino)
fin
procedimiento TShellNotification.DoDriveAdd(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado( FOnDriveAdd ), a continuación,
& nbsp & nbsp & nbsp & nbsp FOnDriveAdd(Auto, Camino)
fin
procedimiento TShellNotification.DoDriveAddGui(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado( FOnDriveAddGui ), a continuación,
& nbsp & nbsp & nbsp & nbsp FOnDriveAdd(Auto, Camino)
fin
procedimiento TShellNotification.DoDriveRemove(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado( FOnDriveRemove ), a continuación,
& nbsp & nbsp & nbsp & nbsp FOnDriveRemove(Auto, Camino)
fin
procedimiento TShellNotification.DoFolderRemove(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado(FOnFolderRemove), a continuación,
& nbsp & nbsp & nbsp & nbsp FOnFolderRemove( Auto, Camino )
fin
procedimiento TShellNotification.DoMediaInsert(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado( FOnMediaInsert ), a continuación,
& nbsp & nbsp & nbsp & nbsp FOnMediaInsert(Auto, Camino)
fin
procedimiento TShellNotification.DoMediaRemove(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado(FOnMediaRemove), a continuación,
& nbsp & nbsp & nbsp & nbsp FOnMediaRemove(Auto, Camino)
fin
procedimiento TShellNotification.DoNetShare(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado(FOnNetShare), a continuación,
& nbsp & nbsp & nbsp & nbsp FOnNetShare(Auto, Camino)
fin
procedimiento TShellNotification.DoNetUnShare(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado(FOnNetUnShare), a continuación,
& nbsp & nbsp & nbsp & nbsp FOnNetUnShare(Auto, Camino)
fin
procedimiento TShellNotification.DoRenameFolder(Ruta1, Ruta2: String)
begin
& nbsp & nbsp si se ha Asignado( FOnRenameFolder ), a continuación,
& nbsp & nbsp & nbsp & nbsp FOnRenameFolder(Self, Ruta1, Ruta2)
fin
procedimiento TShellNotification.DoRenameItem(Ruta1, Ruta2: String)
begin
& nbsp & nbsp si se ha Asignado( FOnItemRename ), a continuación,
& nbsp & nbsp & nbsp & nbsp FonItemRename(Self, Ruta1, Ruta2)
fin
procedimiento TShellNotification.DoServerDisconnect(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado( FOnServerDisconnect ), a continuación,
& nbsp & nbsp & nbsp & nbsp FOnServerDisconnect(Auto, Camino)
fin
función TShellNotification.GetActive: Boolean
begin
& nbsp & nbsp Resultado := (NotifyHandle <> 0) y (fActive)
fin
función TShellNotification.PathFromPidl(Pidl: PItemIDList): String
begin
& nbsp & nbsp SetLength(Resultado, Max_Path)
& nbsp & nbsp si no SHGetPathFromIDList(Pidl, PChar(Resultado)) then Resultado := '
& nbsp & nbsp si pos(#0, Resultado) > 0, entonces
& nbsp & nbsp & nbsp & nbsp SetLength(Resultado, pos(#0, Resultado))
fin
procedimiento TShellNotification.SetActive(const Value: Boolean)
begin
& nbsp & nbsp if (Valor <> fActive), a continuación,
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp fActive := Valor
& nbsp & nbsp & nbsp & nbsp si fActive luego ShellNotifyRegister más ShellNotifyUnregister
& nbsp & nbsp final
fin
procedimiento TShellNotification.SetPath(const Value: String)
begin
& nbsp & nbsp si fPath <> Valor
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp fPath := Valor
& nbsp & nbsp & nbsp & nbsp ShellNotifyRegister
& nbsp & nbsp final
fin
procedimiento TShellNotification.SetWatch(const Value: Boolean)
begin
& nbsp & nbsp si fWatch <> Valor
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp fWatch := Valor
& nbsp & nbsp & nbsp & nbsp ShellNotifyRegister
& nbsp & nbsp final
fin
procedimiento TShellNotification.SetWatchEvents(
& nbsp & nbsp const Value: TNotificationEvents)
begin
& nbsp & nbsp si fWatchEvents <> Valor
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp fWatchEvents := Valor
& nbsp & nbsp & nbsp & nbsp ShellNotifyRegister
& nbsp & nbsp final
fin
procedimiento TShellNotification.ShellNotifyRegister
var
& nbsp & nbsp Opción: TNotificationEvent
& nbsp & nbsp NotifyRecord: NOTIFYREGISTER
& nbsp & nbsp Banderas: DWORD
& nbsp & nbsp Pidl: PItemIDList
& nbsp & nbsp Atributos: ULONG
const
& nbsp & nbsp NotifyFlags: array[TNotificationEvent] de DWORD = (
& nbsp & nbsp & nbsp & nbsp SHCNE_ASSOCCHANGED, SHCNE_ATTRIBUTES, SHCNE_UPDATEITEM,
& nbsp & nbsp & nbsp & nbsp SHCNE_CREATE, SHCNE_DELETE, SHCNE_RENAMEITEM, SHCNE_DRIVEADD,
& nbsp & nbsp & nbsp & nbsp SHCNE_DRIVEREMOVED, SHCNE_DRIVEADDGUI, SHCNE_FREESPACE,
& nbsp & nbsp & nbsp & nbsp SHCNE_MEDIAINSERTED, SHCNE_MEDIAREMOVED, SHCNE_MKDIR,
& nbsp & nbsp & nbsp & nbsp SHCNE_RMDIR, SHCNE_RENAMEFOLDER, SHCNE_UPDATEDIR,
& nbsp & nbsp & nbsp & nbsp SHCNE_NETSHARE, SHCNE_NETUNSHARE, SHCNE_SERVERDISCONNECT,
& nbsp & nbsp & nbsp & nbsp SHCNE_UPDATEIMAGE)
begin
& nbsp & nbsp ShellNotifyUnregister
& nbsp & nbsp si no (csDesigning en ComponentState) y
& nbsp & nbsp & nbsp & nbsp & nbsp no (csLoading en ComponentState), a continuación,
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp SHILCreatefromPath( PChar(fPath), Addr(Pidl), Atributos)
& nbsp & nbsp & nbsp & nbsp NotifyRecord.pidlPath := Pidl
& nbsp & nbsp & nbsp & nbsp NotifyRecord.bWatchSubtree := fWatch
& nbsp & nbsp & nbsp & nbsp Banderas := 0
& nbsp & nbsp & nbsp & nbsp para la Opción := Baja(Opción) a Alta(Opción)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (Opción en FWatchEvents), a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Banderas := Banderas o NotifyFlags[Opción]
& nbsp & nbsp & nbsp & nbsp NotifyHandle := SHChangeNotifyRegister(Asa,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNF_ACCEPT_INTERRUPTS o SHCNF_ACCEPT_NON_INTERRUPTS,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Banderas, SNM_SHELLNOTIFICATION, 1, @NotifyRecord)
& nbsp & nbsp final
fin
procedimiento TShellNotification.ShellNotifyUnregister
begin
& nbsp & nbsp si NotifyHandle <> 0 then
& nbsp & nbsp & nbsp & nbsp SHChangeNotifyDeregister(NotifyHandle)
fin
procedimiento TShellNotification.WndProc(var Message: TMessage)
tipo
& nbsp & nbsp & nbsp TPIDLLIST = record
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp pidlist : array[1..2] de PITEMIDLIST
& nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp PIDARRAY = ^TPIDLLIST
var
& nbsp & nbsp & nbsp Ruta1 : cadena
& nbsp & nbsp & nbsp Ruta2 : string
& nbsp & nbsp & nbsp ptr : PIDARRAY
& nbsp & nbsp & nbsp repite : boolean
& nbsp & nbsp & nbsp evento : longint
begin
& nbsp & nbsp caso de Mensaje.Msg
& nbsp & nbsp & nbsp & nbsp SNM_SHELLNOTIFICATION:
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp evento := Mensaje.LParam y ($7FFFFFFF)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Ptr := PIDARRAY(Mensaje.WParam)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Ruta1 := PathFromPidl( Ptr^.pidlist[1] )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Ruta2 := PathFromPidl( Ptr^.pidList[2] )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp repite := (PrevEvent = evento)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp y (en mayúsculas(prevpath1) = mayúsculas(Ruta1))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp y (en mayúsculas(prevpath2) = mayúsculas(Ruta2))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si se Repite, a continuación, salir
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrevEvent := Mensaje.Msg
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp prevPath1 : = < Ruta1 >
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp prevPath2 : = < Ruta2 >
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp caso de eventos de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_ASSOCCHANGED : DoAssociationChange
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_ATTRIBUTES : DoAttributesChange( Ruta1, Ruta2)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_CREATE : DoCreateFile(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_DELETE : DoDeleteFile(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_DRIVEADD : DoDriveAdd(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_DRIVEADDGUI : DoDriveAddGui(ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_DRIVEREMOVED : DoDriveRemove(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_MEDIAINSERTED : DoMediaInsert(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_MEDIAREMOVED : DoMediaRemove(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_MKDIR : DoDirCreate(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_NETSHARE : DoNetShare(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_NETUNSHARE : DoNetUnShare(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_RENAMEFOLDER : DoRenameFolder(Ruta1, Ruta2)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_RENAMEITEM : DoRenameItem(Ruta1, Ruta2)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_RMDIR : DoFolderRemove(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_SERVERDISCONNECT : DoServerDisconnect(Ruta de acceso)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_UPDATEDIR : DoDirUpdate(Ruta de acceso)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_UPDATEIMAGE :
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_UPDATEITEM :
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final //en Caso de eventos de
& nbsp & nbsp & nbsp & nbsp final //SNM_SHELLNOTIFICATION
& nbsp & nbsp final //caso
fin
procedimiento de Registro
begin
& nbsp & nbsp RegisterComponents('Shell', [TShellNotification])
fin
final.
< & & & & & & & & & Final de la Unidad de Código & & & & & & & & & & & & & >
Mejoras de preguntas et al, por favor deja un comentario o por correo electrónico :)
Gracias a Willian Egge para los informes de errores y ofrecer una solución alrededor de em :)









Obtencion de notificaciones desde el shell


Obtencion de notificaciones desde el shell : Multi-millones de consejos para hacer su vida mas facil.


Como conectar a la carcasa interna evento desencadenante
Si alguna vez has necesitado saber cuando el shell problemas de un evento aqui es un contenedor SHChangeNotifyRegister que permite conocer el tipo de evento y el archivo(s) afectado, este componente esta en la etapa 1 de desarrollo sin embargo, ofrece la funcionalidad completa.
El componente en si se compone de las mejoras realizadas en TSHChangeNotify componente por Elliott Shevin ([email protected])
Por cierto aqui esta una lista de cosas que usted debe tener en cuenta al utilizar este componente, por ejemplo la restauracion de un elemento de la papelera de reciclaje a la ubicacion original encender cambiar el nombre de un evento, mientras que usted recibe una notificacion sobre un evento, usted no puede dejar de que usted acaba de recibir una notificacion de la misma.
la Eliminacion de un Elemento hace 3 eventos: OnFileDelete (Cuando el cuadro de dialogo, o la falta de, se muestra normalmente esto es antes de la eliminacion del archivo) un OnFolderUpdate (despues de que el elemento se elimina y la carpeta se actualiza) y sorpresa otra OnFileDelete (despues de que el archivo ha sido completamente eliminado) este comportamiento no es del componente, sino de la api se basa en.
de acuerdo a la documentacion que he leido de la api que se utiliza en este articulo son totalmente indocumentados, tal vez puede ser posible para detener el evento, sin embargo debido a la falta de documentacion, es desconocido para mi.
< & & & & & & & Comenzar codigo de la UNIDAD & & & & & & & & & & & & & & >
{$IFNDEF VER80} {$IFNDEF VER90} {$IFNDEF VER93}
& nbsp & nbsp {$DEFINE Delphi3orHigher}
{$ENDIF} {$ENDIF} {$ENDIF}
unidad de ShellNotify
interfaz
utiliza Windows, Messages, SysUtils, Clases, Controles, Formularios, cuadros de dialogo,
& nbsp & nbsp {$IFNDEF Delphi3orHigher} OLE2, {$ELSE} ActiveX, ComObj, {$ENDIF}
& nbsp & nbsp ShlObj
tipo
& nbsp & nbsp NOTIFYREGISTER = record
& nbsp & nbsp & nbsp & nbsp pidlPath : PItemIDList
& nbsp & nbsp & nbsp & nbsp bWatchSubtree : boolean
& nbsp & nbsp final
& 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
tipo
& nbsp & nbsp TNotificationEvent = (neAssociationChange, neAttributesChange,
& nbsp & nbsp & nbsp & nbsp neFileChange, neFileCreate, neFileDelete, neFileRename,
& nbsp & nbsp & nbsp & nbsp neDriveAdd, neDriveRemove, neShellDriveAdd, neDriveSpaceChange,
& nbsp & nbsp & nbsp & nbsp neMediaInsert, neMediaRemove, neFolderCreate, neFolderDelete,
& nbsp & nbsp & nbsp & nbsp neFolderRename, neFolderUpdate, neNetShare, neNetUnShare,
& nbsp & nbsp & nbsp & nbsp neServerDisconnect, neImageListChange)
& nbsp & nbsp TNotificationEvents = conjunto de TNotificationEvent
& nbsp & nbsp TShellNotificationEvent1 = procedimiento(Sender: TObject
& nbsp & nbsp & nbsp & nbsp Ruta: String)del Objeto
& nbsp & nbsp TShellNotificationEvent2 = procedimiento(Sender: TObject
& nbsp & nbsp & nbsp & nbsp ruta1, ruta2: String) del Objeto
& nbsp & nbsp TShellNotification = clase(TComponent)
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp fWatchEvents: TNotificationEvents
& nbsp & nbsp & nbsp & nbsp fPath: String
& nbsp & nbsp & nbsp & nbsp fActive, fWatch: Boolean
& nbsp & nbsp & nbsp & nbsp prevPath1, prevPath2: String
& nbsp & nbsp & nbsp & nbsp PrevEvent: Integer
& nbsp & nbsp & nbsp & nbsp Manejar, NotifyHandle: HWND
& nbsp & nbsp & nbsp & nbsp fOnAssociationChange: TNotifyEvent
& nbsp & nbsp & nbsp & nbsp fOnAttribChange: TShellNotificationEvent2
& nbsp & nbsp & nbsp & nbsp FOnCreate: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnDelete: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnDriveAdd: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnDriveAddGui: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnDriveRemove: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnMediaInsert: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnMediaRemove: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnDirCreate: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnNetShare: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnNetUnShare: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnRenameFolder: TShellNotificationEvent2
& nbsp & nbsp & nbsp & nbsp FOnItemRename: TShellNotificationEvent2
& nbsp & nbsp & nbsp & nbsp FOnFolderRemove: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnServerDisconnect: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp FOnFolderUpdate: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp funcion PathFromPidl(Pidl: PItemIDList): String
& nbsp & nbsp & nbsp & nbsp procedimiento SetWatchEvents(const Value: TNotificationEvents)
& nbsp & nbsp & nbsp & nbsp funcion GetActive: Boolean
& nbsp & nbsp & nbsp & nbsp procedimiento SetActive(const Value: Boolean)
& nbsp & nbsp & nbsp & nbsp procedimiento SetPath(const Value: String)
& nbsp & nbsp & nbsp & nbsp procedimiento SetWatch(const Value: Boolean)
& nbsp & nbsp protegido
& nbsp & nbsp & nbsp & nbsp procedimiento ShellNotifyRegister
& nbsp & nbsp & nbsp & nbsp procedimiento ShellNotifyUnregister
& nbsp & nbsp & nbsp & nbsp procedimiento WndProc(var Message: TMessage)
& nbsp & nbsp & nbsp & nbsp procedimiento DoAssociationChange dinamico
& nbsp & nbsp & nbsp & nbsp procedimiento DoAttributesChange(Ruta1, Ruta2: String) dinamico
& nbsp & nbsp & nbsp & nbsp procedimiento DoCreateFile(Ruta: String) dinamico
& nbsp & nbsp & nbsp & nbsp procedimiento DoDeleteFile(Ruta: String) dinamico
& nbsp & nbsp & nbsp & nbsp procedimiento DoDriveAdd(Ruta:String) dinamica
& nbsp & nbsp & nbsp & nbsp procedimiento DoDriveAddGui(Ruta: String) dinamico
& nbsp & nbsp & nbsp & nbsp procedimiento DoDriveRemove(Ruta: String) dinamico
& nbsp & nbsp & nbsp & nbsp procedimiento DoMediaInsert(Ruta: String) dinamico
& nbsp & nbsp & nbsp & nbsp procedimiento DoMediaRemove(Ruta: String) dinamico
& nbsp & nbsp & nbsp & nbsp procedimiento DoDirCreate(Ruta: String) dinamica
& nbsp & nbsp & nbsp & nbsp procedimiento DoNetShare(Ruta: String) dinamico
& nbsp & nbsp & nbsp & nbsp procedimiento DoNetUnShare(Ruta: String) dinamico
& nbsp & nbsp & nbsp & nbsp procedimiento DoRenameFolder(Ruta1, Ruta2: String) dinamico
& nbsp & nbsp & nbsp & nbsp procedimiento DoRenameItem(Ruta1, Ruta2: String) dinamica
& nbsp & nbsp & nbsp & nbsp procedimiento DoFolderRemove(Ruta: String) dinamico
& nbsp & nbsp & nbsp & nbsp procedimiento DoServerDisconnect(Ruta: String) dinamico
& nbsp & nbsp & nbsp & nbsp procedimiento DoDirUpdate(Ruta: String) dinamico
& nbsp & nbsp publica
& nbsp & nbsp & nbsp & nbsp constructor Create(AOwner: TComponent) reemplazar
& nbsp & nbsp & nbsp & nbsp destructor Destruir reemplazar
& nbsp & nbsp publicado
& nbsp & nbsp & nbsp & nbsp Ruta de la propiedad: Cadena de leer fPath escribir SetPath
& nbsp & nbsp & nbsp & nbsp propiedad del Activo: Boolean leer GetActive escribir SetActive
& nbsp & nbsp & nbsp & nbsp propiedad WatchSubTree: Boolean leer fWatch escribir SetWatch
& nbsp & nbsp & nbsp & nbsp propiedad WatchEvents: TNotificationEvents
& nbsp & nbsp & nbsp & nbsp leer fWatchEvents escribir SetWatchEvents
& nbsp & nbsp & nbsp & nbsp propiedad OnAssociationChange: TNotifyEvent
& nbsp & nbsp & nbsp & nbsp leer fOnAssociationChange escribir FOnAssociationChange
& nbsp & nbsp & nbsp & nbsp propiedad OnAttributesChange: TShellNotificationEvent2
& nbsp & nbsp & nbsp & nbsp leer fOnAttribChange escribir fOnAttribChange
& nbsp & nbsp & nbsp & nbsp propiedad OnFileCreate: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnCreate escribir FOnCreate
& nbsp & nbsp & nbsp & nbsp propiedad OnFolderRename: TShellNotificationEvent2
& nbsp & nbsp & nbsp & nbsp leer FOnRenameFolder escribir FOnRenameFolder
& nbsp & nbsp & nbsp & nbsp propiedad OnFolderUpdate: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnFolderUpdate escribir FOnFolderUpdate
& nbsp & nbsp & nbsp & nbsp propiedad OnFileDelete: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnDelete escribir FOnDelete
& nbsp & nbsp & nbsp & nbsp propiedad OnDriveAdd: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnDriveAdd escribir FOnDriveAdd
& nbsp & nbsp & nbsp & nbsp propiedad OnFolderRemove: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnFolderRemove escribir FOnFolderRemove
& nbsp & nbsp & nbsp & nbsp propiedad OnItemRename: TShellNotificationEvent2
& nbsp & nbsp & nbsp & nbsp leer FOnItemRename escribir FOnItemRename
& nbsp & nbsp & nbsp & nbsp propiedad OnDriveAddGui: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnDriveAddGui escribir FOnDriveAddGui
& nbsp & nbsp & nbsp & nbsp propiedad OnDriveRemove: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnDriveRemove escribir FOnDriveRemove
& nbsp & nbsp & nbsp & nbsp propiedad OnMediaInserted: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnMediaInsert escribir FOnMediaInsert
& nbsp & nbsp & nbsp & nbsp propiedad OnMediaRemove: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnMediaRemove escribir FOnMediaRemove
& nbsp & nbsp & nbsp & nbsp propiedad OnDirCreate: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnDirCreate escribir FOnDirCreate
& nbsp & nbsp & nbsp & nbsp propiedad OnNetShare: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnNetShare escribir FOnNetShare
& nbsp & nbsp & nbsp & nbsp propiedad OnNetUnShare: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnNetUnShare escribir FOnNetUnShare
& nbsp & nbsp & nbsp & nbsp propiedad OnServerDisconnect: TShellNotificationEvent1
& nbsp & nbsp & nbsp & nbsp leer FOnServerDisconnect escribir FOnServerDisconnect
& nbsp & nbsp final
& nbsp & nbsp funcion SHChangeNotifyRegister( hWnd: HWND dwFlags: integer
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp wEventMask : el cardenal uMsg: UINT cItems : integer
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp lpItems : PNOTIFYREGISTER) : HWND stdcall
& nbsp & nbsp funcion SHChangeNotifyDeregister(hWnd: HWND) : boolean stdcall
& nbsp & nbsp funcion SHILCreateFromPath(Ruta de acceso: Puntero PIDL: PItemIDList
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp var Atributos: ULONG):HResult stdcall
& nbsp & nbsp procedimiento de Registro
aplicacion
const Shell32DLL = 'shell32.dll'
& nbsp & nbsp funcion SHChangeNotifyRegister externo Shell32DLL indice 2
& nbsp & nbsp funcion SHChangeNotifyDeregister externo Shell32DLL indice 4
& nbsp & nbsp funcion SHILCreateFromPath externo Shell32DLL indice 28
{ TShellNotification }
constructor TShellNotification.Create(AOwner: TComponent)
begin
& nbsp & nbsp inherited Create( AOwner )
& nbsp & nbsp si no (csDesigning en ComponentState), a continuacion,
& nbsp & nbsp & nbsp & nbsp Identificador := AllocateHWnd(WndProc)
& nbsp & nbsp PrevEvent := 0
& nbsp & nbsp fWatchEvents := [neAssociationChange, neAttributesChange,
& nbsp & nbsp & nbsp & nbsp neFileChange, neFileCreate, neFileDelete, neFileRename,
& nbsp & nbsp & nbsp & nbsp neDriveAdd, neDriveRemove, neShellDriveAdd, neDriveSpaceChange,
& nbsp & nbsp & nbsp & nbsp neMediaInsert, neMediaRemove, neFolderCreate, neFolderDelete,
& nbsp & nbsp & nbsp & nbsp neFolderRename, neFolderUpdate, neNetShare, neNetUnShare,
& nbsp & nbsp & nbsp & nbsp neServerDisconnect, neImageListChange]
fin
destructor TShellNotification.Destruir
begin

& nbsp & nbsp si no (csDesigning en ComponentState), a continuacion,
& nbsp & nbsp & nbsp & nbsp Active := False
& nbsp & nbsp si el Identificador <> 0 entonces DeallocateHWnd( Asa )
& nbsp & nbsp heredado Destruir
fin
procedimiento TShellNotification.DoAssociationChange
begin
& nbsp & nbsp si se ha Asignado( fOnAssociationChange ) y (neAssociationChange en fWatchEvents), a continuacion,
& nbsp & nbsp & nbsp & nbsp fOnAssociationChange( Auto )
fin
procedimiento TShellNotification.DoAttributesChange
begin
& nbsp & nbsp si se ha Asignado( fOnAttribChange ), a continuacion,
& nbsp & nbsp & nbsp & nbsp fOnAttribChange( Self, Ruta1, Ruta2 )
fin
procedimiento TShellNotification.DoCreateFile(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado( fOnCreate ), a continuacion,
& nbsp & nbsp & nbsp & nbsp FOnCreate(Auto, Camino)
fin
procedimiento TShellNotification.DoDeleteFile(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado( FOnDelete ), a continuacion,
& nbsp & nbsp & nbsp & nbsp FOnDelete(Auto, Camino)
fin
procedimiento TShellNotification.DoDirCreate(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado( FOnDirCreate ), a continuacion,
& nbsp & nbsp & nbsp & nbsp FOnDirCreate( Auto, Camino )
fin
procedimiento TShellNotification.DoDirUpdate(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado( FOnFolderUpdate ), a continuacion,
& nbsp & nbsp & nbsp & nbsp FOnFolderUpdate(Auto, Camino)
fin
procedimiento TShellNotification.DoDriveAdd(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado( FOnDriveAdd ), a continuacion,
& nbsp & nbsp & nbsp & nbsp FOnDriveAdd(Auto, Camino)
fin
procedimiento TShellNotification.DoDriveAddGui(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado( FOnDriveAddGui ), a continuacion,
& nbsp & nbsp & nbsp & nbsp FOnDriveAdd(Auto, Camino)
fin
procedimiento TShellNotification.DoDriveRemove(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado( FOnDriveRemove ), a continuacion,
& nbsp & nbsp & nbsp & nbsp FOnDriveRemove(Auto, Camino)
fin
procedimiento TShellNotification.DoFolderRemove(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado(FOnFolderRemove), a continuacion,
& nbsp & nbsp & nbsp & nbsp FOnFolderRemove( Auto, Camino )
fin
procedimiento TShellNotification.DoMediaInsert(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado( FOnMediaInsert ), a continuacion,
& nbsp & nbsp & nbsp & nbsp FOnMediaInsert(Auto, Camino)
fin
procedimiento TShellNotification.DoMediaRemove(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado(FOnMediaRemove), a continuacion,
& nbsp & nbsp & nbsp & nbsp FOnMediaRemove(Auto, Camino)
fin
procedimiento TShellNotification.DoNetShare(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado(FOnNetShare), a continuacion,
& nbsp & nbsp & nbsp & nbsp FOnNetShare(Auto, Camino)
fin
procedimiento TShellNotification.DoNetUnShare(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado(FOnNetUnShare), a continuacion,
& nbsp & nbsp & nbsp & nbsp FOnNetUnShare(Auto, Camino)
fin
procedimiento TShellNotification.DoRenameFolder(Ruta1, Ruta2: String)
begin
& nbsp & nbsp si se ha Asignado( FOnRenameFolder ), a continuacion,
& nbsp & nbsp & nbsp & nbsp FOnRenameFolder(Self, Ruta1, Ruta2)
fin
procedimiento TShellNotification.DoRenameItem(Ruta1, Ruta2: String)
begin
& nbsp & nbsp si se ha Asignado( FOnItemRename ), a continuacion,
& nbsp & nbsp & nbsp & nbsp FonItemRename(Self, Ruta1, Ruta2)
fin
procedimiento TShellNotification.DoServerDisconnect(Ruta: String)
begin
& nbsp & nbsp si se ha Asignado( FOnServerDisconnect ), a continuacion,
& nbsp & nbsp & nbsp & nbsp FOnServerDisconnect(Auto, Camino)
fin
funcion TShellNotification.GetActive: Boolean
begin
& nbsp & nbsp Resultado := (NotifyHandle <> 0) y (fActive)
fin
funcion TShellNotification.PathFromPidl(Pidl: PItemIDList): String
begin
& nbsp & nbsp SetLength(Resultado, Max_Path)
& nbsp & nbsp si no SHGetPathFromIDList(Pidl, PChar(Resultado)) then Resultado := '
& nbsp & nbsp si pos(#0, Resultado) > 0, entonces
& nbsp & nbsp & nbsp & nbsp SetLength(Resultado, pos(#0, Resultado))
fin
procedimiento TShellNotification.SetActive(const Value: Boolean)
begin
& nbsp & nbsp if (Valor <> fActive), a continuacion,
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp fActive := Valor
& nbsp & nbsp & nbsp & nbsp si fActive luego ShellNotifyRegister mas ShellNotifyUnregister
& nbsp & nbsp final
fin
procedimiento TShellNotification.SetPath(const Value: String)
begin
& nbsp & nbsp si fPath <> Valor
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp fPath := Valor
& nbsp & nbsp & nbsp & nbsp ShellNotifyRegister
& nbsp & nbsp final
fin
procedimiento TShellNotification.SetWatch(const Value: Boolean)
begin
& nbsp & nbsp si fWatch <> Valor
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp fWatch := Valor
& nbsp & nbsp & nbsp & nbsp ShellNotifyRegister
& nbsp & nbsp final
fin
procedimiento TShellNotification.SetWatchEvents(
& nbsp & nbsp const Value: TNotificationEvents)
begin
& nbsp & nbsp si fWatchEvents <> Valor
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp fWatchEvents := Valor
& nbsp & nbsp & nbsp & nbsp ShellNotifyRegister
& nbsp & nbsp final
fin
procedimiento TShellNotification.ShellNotifyRegister
var
& nbsp & nbsp Opcion: TNotificationEvent
& nbsp & nbsp NotifyRecord: NOTIFYREGISTER
& nbsp & nbsp Banderas: DWORD
& nbsp & nbsp Pidl: PItemIDList
& nbsp & nbsp Atributos: ULONG
const
& nbsp & nbsp NotifyFlags: array[TNotificationEvent] de DWORD = (
& nbsp & nbsp & nbsp & nbsp SHCNE_ASSOCCHANGED, SHCNE_ATTRIBUTES, SHCNE_UPDATEITEM,
& nbsp & nbsp & nbsp & nbsp SHCNE_CREATE, SHCNE_DELETE, SHCNE_RENAMEITEM, SHCNE_DRIVEADD,
& nbsp & nbsp & nbsp & nbsp SHCNE_DRIVEREMOVED, SHCNE_DRIVEADDGUI, SHCNE_FREESPACE,
& nbsp & nbsp & nbsp & nbsp SHCNE_MEDIAINSERTED, SHCNE_MEDIAREMOVED, SHCNE_MKDIR,
& nbsp & nbsp & nbsp & nbsp SHCNE_RMDIR, SHCNE_RENAMEFOLDER, SHCNE_UPDATEDIR,
& nbsp & nbsp & nbsp & nbsp SHCNE_NETSHARE, SHCNE_NETUNSHARE, SHCNE_SERVERDISCONNECT,
& nbsp & nbsp & nbsp & nbsp SHCNE_UPDATEIMAGE)
begin
& nbsp & nbsp ShellNotifyUnregister
& nbsp & nbsp si no (csDesigning en ComponentState) y
& nbsp & nbsp & nbsp & nbsp & nbsp no (csLoading en ComponentState), a continuacion,
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp SHILCreatefromPath( PChar(fPath), Addr(Pidl), Atributos)
& nbsp & nbsp & nbsp & nbsp NotifyRecord.pidlPath := Pidl
& nbsp & nbsp & nbsp & nbsp NotifyRecord.bWatchSubtree := fWatch
& nbsp & nbsp & nbsp & nbsp Banderas := 0
& nbsp & nbsp & nbsp & nbsp para la Opcion := Baja(Opcion) a Alta(Opcion)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (Opcion en FWatchEvents), a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Banderas := Banderas o NotifyFlags[Opcion]
& nbsp & nbsp & nbsp & nbsp NotifyHandle := SHChangeNotifyRegister(Asa,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNF_ACCEPT_INTERRUPTS o SHCNF_ACCEPT_NON_INTERRUPTS,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Banderas, SNM_SHELLNOTIFICATION, 1, @NotifyRecord)
& nbsp & nbsp final
fin
procedimiento TShellNotification.ShellNotifyUnregister
begin
& nbsp & nbsp si NotifyHandle <> 0 then
& nbsp & nbsp & nbsp & nbsp SHChangeNotifyDeregister(NotifyHandle)
fin
procedimiento TShellNotification.WndProc(var Message: TMessage)
tipo
& nbsp & nbsp & nbsp TPIDLLIST = record
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp pidlist : array[1..2] de PITEMIDLIST
& nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp PIDARRAY = ^TPIDLLIST
var
& nbsp & nbsp & nbsp Ruta1 : cadena
& nbsp & nbsp & nbsp Ruta2 : string
& nbsp & nbsp & nbsp ptr : PIDARRAY
& nbsp & nbsp & nbsp repite : boolean
& nbsp & nbsp & nbsp evento : longint
begin
& nbsp & nbsp caso de Mensaje.Msg
& nbsp & nbsp & nbsp & nbsp SNM_SHELLNOTIFICATION:
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp evento := Mensaje.LParam y ($7FFFFFFF)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Ptr := PIDARRAY(Mensaje.WParam)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Ruta1 := PathFromPidl( Ptr^.pidlist[1] )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Ruta2 := PathFromPidl( Ptr^.pidList[2] )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp repite := (PrevEvent = evento)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp y (en mayusculas(prevpath1) = mayusculas(Ruta1))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp y (en mayusculas(prevpath2) = mayusculas(Ruta2))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si se Repite, a continuacion, salir
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PrevEvent := Mensaje.Msg
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp prevPath1 : = < Ruta1 >
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp prevPath2 : = < Ruta2 >
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp caso de eventos de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_ASSOCCHANGED : DoAssociationChange
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_ATTRIBUTES : DoAttributesChange( Ruta1, Ruta2)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_CREATE : DoCreateFile(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_DELETE : DoDeleteFile(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_DRIVEADD : DoDriveAdd(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_DRIVEADDGUI : DoDriveAddGui(ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_DRIVEREMOVED : DoDriveRemove(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_MEDIAINSERTED : DoMediaInsert(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_MEDIAREMOVED : DoMediaRemove(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_MKDIR : DoDirCreate(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_NETSHARE : DoNetShare(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_NETUNSHARE : DoNetUnShare(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_RENAMEFOLDER : DoRenameFolder(Ruta1, Ruta2)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_RENAMEITEM : DoRenameItem(Ruta1, Ruta2)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_RMDIR : DoFolderRemove(Ruta1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_SERVERDISCONNECT : DoServerDisconnect(Ruta de acceso)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_UPDATEDIR : DoDirUpdate(Ruta de acceso)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_UPDATEIMAGE :
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SHCNE_UPDATEITEM :
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final //en Caso de eventos de
& nbsp & nbsp & nbsp & nbsp final //SNM_SHELLNOTIFICATION
& nbsp & nbsp final //caso
fin
procedimiento de Registro
begin
& nbsp & nbsp RegisterComponents('Shell', [TShellNotification])
fin
final.
< & & & & & & & & & Final de la Unidad de Codigo & & & & & & & & & & & & & >
Mejoras de preguntas et al, por favor deja un comentario o por correo electronico :)
Gracias a Willian Egge para los informes de errores y ofrecer una solucion alrededor de em :)


Obtención de notificaciones desde el shell

Obtención de notificaciones desde el shell : Multi-millones de consejos para hacer su vida más fácil.
Recommander aux amis
  • gplus
  • pinterest

Comentario

Dejar un comentario

Clasificación