unit Unit2;
interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, shlobj, activex, StdCtrls, FileCtrl,strUtils;
constshcne_renameitem = $1;
shcne_create = $2;
shcne_delete = $4;
shcne_mkdir = $8;
shcne_rmdir = $10;
shcne_mediainserted = $20;
shcne_mediaremoved = $40;
shcne_driveremoved = $80;
shcne_driveadd = $100;
shcne_netshare = $200;
shcne_netunshare = $400;
shcne_attributes = $800;
shcne_updatedir = $1000;
shcne_updateitem = $2000;
shcne_serverdisconnect = $4000;
shcne_updateimage = $8000;
shcne_driveaddgui = $10000;
shcne_renamefolder = $20000;
shcne_freespace = $40000;
shcne_assocchanged = $8000000;
shcne_diskevents = $2381F;
shcne_globalevents = $C0581E0;
shcne_allevents = $7FFFFFFF;
shcne_interrupt = $80000000;
shcnf_idlist = 0;
// lpitemidlist
shcnf_patha = $1;
// path name
shcnf_printera = $2;
// printer friendly name
shcnf_dword = $3;
// dword
shcnf_pathw = $5;
// path name
shcnf_printerw = $6;
// printer friendly name
shcnf_
type = $FF;
shcnf_flush = $1000;
shcnf_flushnowait = $2000;
shcnf_path = shcnf_pathw;
shcnf_printer = shcnf_printerw;
wm_shnotify = $401;
noerror = 0;
typeTForm1 =
class(TForm)
Button1: TButton;
Memo1: TMemo;
DirectoryListBox1: TDirectoryListBox;
DriveComboBox1: TDriveComboBox;
Label1: TLabel;
Button2: TButton;
procedure FormClose(Sender: TObject;
var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private{ Private declarations }procedure wmshellreg(
var message: tmessage);
message wm_shnotify;
public{ Public declarations }end;
type pshnotifystruct = ^shnotifystruct;
shnotifystruct =
recorddwitem1: pitemidlist;
dwitem2: pitemidlist;
end;
type pshfileinfobyte = ^shfileinfobyte;
_shfileinfobyte =
recordhicon: integer;
iicon: integer;
dwattributes: integer;
szdisplayname:
array[0..259]
of char;
sztypename:
array[0..79]
of char;
end;
shfileinfobyte = _shfileinfobyte;
type pidlstruct = ^idlstruct;
_idlstruct =
recordpidl: pitemidlist;
bwatchsubfolders: integer;
end;
idlstruct = _idlstruct;
function shnotify_register(hwnd: integer): bool;
function shnotify_unregister: bool;
function sheventname(strpath1, strpath2:
string; lparam: integer):
string;
function shchangenotifyderegister(hnotify: integer): integer; stdcall;
external ''shell32.dll''
index 4;
function shchangenotifyregister(hwnd, uflags, dweventid, umsg, citems: longword;
lpps: pidlstruct): integer; stdcall;
external ''shell32.dll''
index 2;
function shgetfileinfopidl(pidl: pitemidlist;
dwfileattributes: integer;
psfib: pshfileinfobyte;
cbfileinfo: integer;
uflags: integer): integer; stdcall;
external ''shell32.dll''
name ''shgetfileinfoa'';
varForm1: TForm1;
m_hshnotify: integer;
m_pidldesktop: pitemidlist;
implementation{$R *.dfm}function sheventname(strpath1, strpath2:
string; lparam: integer):
string;
varsevent:
string;
begin case lparam
of //根据参数设置提示消息
shcne_renameitem: sevent := ''rename'' + strpath1 + '':'' + strpath2;
shcne_create: sevent := ''建立文件 文件名:'' + strpath1;
shcne_delete: sevent := ''删除文件 文件名:'' + strpath1;
shcne_mkdir: sevent := ''新建目录 目录名:'' + strpath1;
shcne_rmdir: sevent := ''删除目录 目录名:'' + strpath1;
shcne_mediainserted: sevent := strpath1 + ''中插入可移动存储介质'';
shcne_mediaremoved: sevent := strpath1 + ''中移去可移动存储介质'' + strpath1 + '' '' + strpath2;
shcne_driveremoved: sevent := ''移去驱动器'' + strpath1;
shcne_driveadd: sevent := ''添加驱动器'' + strpath1;
shcne_netshare: sevent := ''改变目录'' + strpath1 + ''的共享属性'';
shcne_attributes: sevent := ''改变文件目录属性 文件名'' + strpath1;
shcne_updatedir: sevent := ''更新目录'' + strpath1;
shcne_updateitem: sevent := ''更新文件 文件名:'' + strpath1;
shcne_serverdisconnect: sevent := ''断开与服务器的连接'' + strpath1 + '' '' + strpath2;
shcne_updateimage: sevent := ''shcne_updateimage'';
shcne_driveaddgui: sevent := ''shcne_driveaddgui'';
shcne_renamefolder: sevent := ''重命名文件夹'' + strpath1 + ''为'' + strpath2;
shcne_freespace: sevent := ''磁盘空间大小改变'';
shcne_assocchanged: sevent := ''改变文件关联'';
else sevent := ''未知操作'' + inttostr(lparam);
end;
result := sevent;
end;
function shnotify_register(hwnd: integer): bool;
varps: pidlstruct;
begin {$R-} result :=
false;
if m_hshnotify = 0
then begin //获取桌面文件夹的pidl
if shgetspecialfolderlocation(0, CSIDL_DESKTOP, m_pidldesktop) <> noerror
then form1.close;
if boolean(m_pidldesktop)
then begin new(ps);
try ps.bwatchsubfolders := 1;
ps.pidl := m_pidldesktop;
// 利用shchangenotifyregister函数注册系统消息处理
m_hshnotify := shchangenotifyregister(hwnd, (shcnf_
type or shcnf_idlist),
(shcne_allevents
or shcne_interrupt),
wm_shnotify, 1, ps);
result := boolean(m_hshnotify);
finally FreeMem(ps);
end;
end else // 如果出现错误就使用 cotaskmemfree函数来释放句柄
cotaskmemfree(m_pidldesktop);
end;
&nbs