1. Home
  2. Computing & Technology
  3. Delphi Programming

{
Article: 
Monitoring System Shell Changes using Delphi

http://delphi.about.com/library/library/weekly/aa030403a.htm

Wanna get notified when a file gets created, renamed or
deleted on the system? Need to know the exact folder and 
file name? Let's start monitoring system shell changes! 
What a great extension to your "Big Brother" 
Delphi code toolkit - part 3.

Download the ZIPed project source.

Download the TSHChangeNotify component with source.

}


Here are the sources to the demo project :

  • TSHChangeNotify
  • Form1.dfm and Unit1.pas
  • Unit1.PAS

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, SHChangeNotify, ComCtrls, ExtCtrls, StdCtrls; type TForm1 = class(TForm) lv: TListView; cn: TSHChangeNotify; pc: TPageControl; tsView: TTabSheet; tsTree: TTabSheet; tv: TTreeView; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure cnAssocChanged(Sender: TObject; Flags: Cardinal; Path1, Path2: String); procedure cnAttributes(Sender: TObject; Flags: Cardinal; Path1: String); procedure cnCreate(Sender: TObject; Flags: Cardinal; Path1: String); procedure cnDelete(Sender: TObject; Flags: Cardinal; Path1: String); procedure cnDriveAdd(Sender: TObject; Flags: Cardinal; Path1: String); procedure cnDriveAddGUI(Sender: TObject; Flags: Cardinal; Path1: String); procedure cnDriveRemoved(Sender: TObject; Flags: Cardinal; Path1: String); procedure cnEndSessionQuery(Sender: TObject; var CanEndSession: Boolean); procedure cnMediaInserted(Sender: TObject; Flags: Cardinal; Path1: String); procedure cnMediaRemoved(Sender: TObject; Flags: Cardinal; Path1: String); procedure cnMkDir(Sender: TObject; Flags: Cardinal; Path1: String); procedure cnNetShare(Sender: TObject; Flags: Cardinal; Path1: String); procedure cnNetUnshare(Sender: TObject; Flags: Cardinal; Path1: String); procedure cnRenameFolder(Sender: TObject; Flags: Cardinal; Path1, Path2: String); procedure cnRenameItem(Sender: TObject; Flags: Cardinal; Path1, Path2: String); procedure cnRmDir(Sender: TObject; Flags: Cardinal; Path1: String); procedure cnServerDisconnect(Sender: TObject; Flags: Cardinal; Path1: String); procedure cnUpdateDir(Sender: TObject; Flags: Cardinal; Path1: String); procedure cnUpdateImage(Sender: TObject; Flags: Cardinal; Path1: String); procedure cnUpdateItem(Sender: TObject; Flags: Cardinal; Path1: String); private public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function GetNodeByText(ATree:TTreeView; AValue:String; AVisible: Boolean): TTreeNode; var Node: TTreeNode; begin Result := nil; if ATree.Items.Count = 0 then Exit; Node := ATree.Items[0]; while Node <> nil do begin if UpperCase(Node.Text) = UpperCase(AValue) then begin Result := Node; if AVisible then Result.MakeVisible; Break; end; { if } Node := Node.GetNext; end; { while } end; procedure TForm1.FormCreate(Sender: TObject); begin tv.Items.AddFirst(TTreeNode.Create(tv.Items),'AssocChanged'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'Attributes'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'Create'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'Delete'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'DriveAdd'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'DriveAddGUI'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'DriveRemoved'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'EndSessionQuery'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'MediaInserted'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'MediaRemoved'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'MkDir'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'NetShare'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'NetUnshare'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'RenameFolder'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'RenameItem'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'RmDir'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'ServerDisconnect'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'UpdateDir'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'UpdateImage'); tv.Items.AddFirst(TTreeNode.Create(tv.Items),'UpdateItem'); cn.Execute; end; procedure TForm1.FormDestroy(Sender: TObject); begin cn.Stop; end; procedure TForm1.cnAssocChanged(Sender: TObject; Flags: Cardinal; Path1, Path2: String); begin with lv.Items.Add do begin Caption:=DateTimeToStr(Now); SubItems.Add('AssocChanged'); SubItems.Add(Path1); SubItems.Add(Path2); end; tv.Items.AddChildFirst(GetNodeByText(tv,'AssocChanged',false),DateTimeToStr(Now) + #9 + Path1 + #9 + Path2); end; procedure TForm1.cnAttributes(Sender: TObject; Flags: Cardinal; Path1: String); begin with lv.Items.Add do begin Caption:=DateTimeToStr(Now); SubItems.Add('Attributes'); SubItems.Add(Path1); SubItems.Add(''); end; tv.Items.AddChildFirst(GetNodeByText(tv,'Attributes',false),DateTimeToStr(Now) + #9 + Path1); end; procedure TForm1.cnCreate(Sender: TObject; Flags: Cardinal; Path1: String); begin with lv.Items.Add do begin Caption:=DateTimeToStr(Now); SubItems.Add('Create'); SubItems.Add(Path1); SubItems.Add(''); end; tv.Items.AddChildFirst(GetNodeByText(tv,'Create',false),DateTimeToStr(Now) + #9 + Path1); end; procedure TForm1.cnDelete(Sender: TObject; Flags: Cardinal; Path1: String); begin with lv.Items.Add do begin Caption:=DateTimeToStr(Now); SubItems.Add('Delete'); SubItems.Add(Path1); SubItems.Add(''); end; tv.Items.AddChildFirst(GetNodeByText(tv,'Delete',false),DateTimeToStr(Now) + #9 + Path1); end; procedure TForm1.cnDriveAdd(Sender: TObject; Flags: Cardinal; Path1: String); begin with lv.Items.Add do begin Caption:=DateTimeToStr(Now); SubItems.Add('DriveAdd'); SubItems.Add(Path1); SubItems.Add(''); end; tv.Items.AddChildFirst(GetNodeByText(tv,'DriveAdd',false),DateTimeToStr(Now) + #9 + Path1); end; procedure TForm1.cnDriveAddGUI(Sender: TObject; Flags: Cardinal; Path1: String); begin with lv.Items.Add do begin Caption:=DateTimeToStr(Now); SubItems.Add('DriveAddGUI'); SubItems.Add(Path1); SubItems.Add(''); end; tv.Items.AddChildFirst(GetNodeByText(tv,'DriveAddGUI',false),DateTimeToStr(Now) + #9 + Path1); end; procedure TForm1.cnDriveRemoved(Sender: TObject; Flags: Cardinal; Path1: String); begin with lv.Items.Add do begin Caption:=DateTimeToStr(Now); SubItems.Add('DriveRemoved'); SubItems.Add(Path1); SubItems.Add(''); end; tv.Items.AddChildFirst(GetNodeByText(tv,'DriveRemoved',false),DateTimeToStr(Now) + #9 + Path1); end; procedure TForm1.cnEndSessionQuery(Sender: TObject; var CanEndSession: Boolean); begin with lv.Items.Add do begin Caption:=DateTimeToStr(Now); SubItems.Add('EndSessionQuery'); SubItems.Add(''); SubItems.Add(''); end; tv.Items.AddChildFirst(GetNodeByText(tv,'EndSessionQuery',false),DateTimeToStr(Now)); end; procedure TForm1.cnMediaInserted(Sender: TObject; Flags: Cardinal; Path1: String); begin with lv.Items.Add do begin Caption:=DateTimeToStr(Now); SubItems.Add('MediaInserted'); SubItems.Add(Path1); SubItems.Add(''); end; tv.Items.AddChildFirst(GetNodeByText(tv,'MediaInserted',false),DateTimeToStr(Now) + #9 + Path1); end; procedure TForm1.cnMediaRemoved(Sender: TObject; Flags: Cardinal; Path1: String); begin with lv.Items.add do begin Caption:=DateTimeToStr(Now); SubItems.Add('MediaRemoved'); SubItems.Add(Path1); SubItems.Add(''); end; tv.Items.AddChildFirst(GetNodeByText(tv,'MediaRemoved',false),DateTimeToStr(Now) + #9 + Path1); end; procedure TForm1.cnMkDir(Sender: TObject; Flags: Cardinal; Path1: String); begin with lv.Items.add do begin Caption:=DateTimeToStr(Now); SubItems.Add('MkDir'); SubItems.Add(Path1); SubItems.Add(''); end; tv.Items.AddChildFirst(GetNodeByText(tv,'MkDir',false),DateTimeToStr(Now) + #9 + Path1); end; procedure TForm1.cnNetShare(Sender: TObject; Flags: Cardinal; Path1: String); begin with lv.Items.add do begin Caption:=DateTimeToStr(Now); SubItems.Add('NetShare'); SubItems.Add(Path1); SubItems.Add(''); end; tv.Items.AddChildFirst(GetNodeByText(tv,'NetShare',false),DateTimeToStr(Now) + #9 + Path1); end; procedure TForm1.cnNetUnshare(Sender: TObject; Flags: Cardinal; Path1: String); begin with lv.Items.add do begin Caption:=DateTimeToStr(Now); SubItems.Add('NetUnshare'); SubItems.Add(Path1); SubItems.Add(''); end; tv.Items.AddChildFirst(GetNodeByText(tv,'NetUnshare',false),DateTimeToStr(Now) + #9 + Path1); end; procedure TForm1.cnRenameFolder(Sender: TObject; Flags: Cardinal; Path1, Path2: String); begin with lv.Items.add do begin Caption:=DateTimeToStr(Now); SubItems.Add('RenameFolder'); SubItems.Add(Path1); SubItems.Add(Path2); end; tv.Items.AddChildFirst(GetNodeByText(tv,'RenameFolder',false),DateTimeToStr(Now) + #9 + Path1 + #9 + Path2); end; procedure TForm1.cnRenameItem(Sender: TObject; Flags: Cardinal; Path1, Path2: String); begin with lv.Items.add do begin Caption:=DateTimeToStr(Now); SubItems.Add('RenameItem'); SubItems.Add(Path1); SubItems.Add(Path2); end; tv.Items.AddChildFirst(GetNodeByText(tv,'RenameItem',false),DateTimeToStr(Now) + #9 + Path1 + #9 + Path2); end; procedure TForm1.cnRmDir(Sender: TObject; Flags: Cardinal; Path1: String); begin with lv.Items.add do begin Caption:=DateTimeToStr(Now); SubItems.Add('RmDir'); SubItems.Add(Path1); SubItems.Add(''); end; tv.Items.AddChildFirst(GetNodeByText(tv,'RmDir',false),DateTimeToStr(Now) + #9 + Path1); end; procedure TForm1.cnServerDisconnect(Sender: TObject; Flags: Cardinal; Path1: String); begin with lv.Items.add do begin Caption:=DateTimeToStr(Now); SubItems.Add('ServerDisconnect'); SubItems.Add(Path1); SubItems.Add(''); end; tv.Items.AddChildFirst(GetNodeByText(tv,'ServerDisconnect',false),DateTimeToStr(Now) + #9 + Path1); end; procedure TForm1.cnUpdateDir(Sender: TObject; Flags: Cardinal; Path1: String); begin with lv.Items.add do begin Caption:=DateTimeToStr(Now); SubItems.Add('UpdateDir'); SubItems.Add(Path1); SubItems.Add(''); end; tv.Items.AddChildFirst(GetNodeByText(tv,'UpdateDir',false),DateTimeToStr(Now) + #9 + Path1); end; procedure TForm1.cnUpdateImage(Sender: TObject; Flags: Cardinal; Path1: String); begin with lv.Items.add do begin Caption:=DateTimeToStr(Now); SubItems.Add('UpdateImage'); SubItems.Add(Path1); SubItems.Add(''); end; tv.Items.AddChildFirst(GetNodeByText(tv,'UpdateImage',false),DateTimeToStr(Now) + #9 + Path1); end; procedure TForm1.cnUpdateItem(Sender: TObject; Flags: Cardinal; Path1: String); begin with lv.Items.add do begin Caption:=DateTimeToStr(Now); SubItems.Add('UpdateItem'); SubItems.Add(Path1); SubItems.Add(''); end; tv.Items.AddChildFirst(GetNodeByText(tv,'UpdateItem',false),DateTimeToStr(Now) + #9 + Path1); end; end.

    Form1.DFM

    Select Form1, Right Click to get context popup menu, Select View As Text, Paste the text into Editor, Select View As Form. object Form1: TForm1 Left = 235 Top = 179 Width = 433 Height = 213 Caption = 'Shell Change Notify Example' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate OnDestroy = FormDestroy PixelsPerInch = 96 TextHeight = 13 object pc: TPageControl Left = 0 Top = 0 Width = 425 Height = 186 ActivePage = tsView Align = alClient TabOrder = 0 object tsView: TTabSheet Caption = 'List View' object lv: TListView Left = 0 Top = 0 Width = 417 Height = 158 Align = alClient Columns = < item Caption = 'Time' end item Caption = 'Action' end item Caption = 'Path1' end item Caption = 'Path2' end> TabOrder = 0 ViewStyle = vsReport end end object tsTree: TTabSheet Caption = 'Tree View' ImageIndex = 1 object tv: TTreeView Left = 0 Top = 0 Width = 417 Height = 158 Align = alClient Indent = 19 TabOrder = 0 end end end object cn: TSHChangeNotify MessageNo = 1025 HardDriveOnly = False OnAssocChanged = cnAssocChanged OnAttributes = cnAttributes OnCreate = cnCreate OnDelete = cnDelete OnDriveAdd = cnDriveAdd OnDriveAddGUI = cnDriveAddGUI OnDriveRemoved = cnDriveRemoved OnMediaInserted = cnMediaInserted OnMediaRemoved = cnMediaRemoved OnMkDir = cnMkDir OnNetShare = cnNetShare OnNetUnshare = cnNetUnshare OnRenameFolder = cnRenameFolder OnRenameItem = cnRenameItem OnRmDir = cnRmDir OnServerDisconnect = cnServerDisconnect OnUpdateDir = cnUpdateDir OnUpdateImage = cnUpdateImage OnUpdateItem = cnUpdateItem OnEndSessionQuery = cnEndSessionQuery Left = 112 Top = 72 end end { ******************************************** Zarko Gajic About.com Guide to Delphi Programming http://delphi.about.com email: delphi.guide@about.com free newsletter: http://delphi.about.com/library/blnewsletter.htm forum: http://forums.about.com/ab-delphi/start/ ******************************************** }
    Explore Delphi Programming
    About.com Special Features

    The Best Web Trends of the Decade

    A look back at the best innovations, ideas and technologies over the last 10 years, More >

    Family Tech Center

    Stay connected and entertained with reviews on tips on the latest HDTVs, cellphones and more. More >

    1. Home
    2. Computing & Technology
    3. Delphi Programming

    ©2010 About.com, a part of The New York Times Company.

    All rights reserved.