监视资源管理器的文件变化

2016-02-19 21:30 8 1 收藏

下面图老师小编跟大家分享一个简单易学的监视资源管理器的文件变化教程,get新技能是需要行动的,喜欢的朋友赶紧收藏起来学习下吧!

【 tulaoshi.com - 编程语言 】

我的主页:http://www.tommstudio.com/

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)


unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, shlobj, activex, StdCtrls, FileCtrl,strUtils;

const
shcne_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;


type
TForm1 = 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 = record
dwitem1: pitemidlist;
dwitem2: pitemidlist;
end;

type pshfileinfobyte = ^shfileinfobyte;
_shfileinfobyte = record
hicon: integer;
iicon: integer;
dwattributes: integer;
szdisplayname: array[0..259] of char;
sztypename: array[0..79] of char;
end;
shfileinfobyte = _shfileinfobyte;

type pidlstruct = ^idlstruct;
_idlstruct = record
pidl: 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';


var
Form1: TForm1;
m_hshnotify: integer;
m_pidldesktop: pitemidlist;


implementation

{$R *.dfm}

function sheventname(strpath1, strpath2: string; lparam: integer): string;
var
sevent: 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;
var
ps: 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;
    {$R+}
  end;
  
  function shnotify_unregister: bool;
  begin
    result := false;
    if boolean(m_hshnotify) then
    //取消系统消息监视,同时释放桌面的pidl
    if boolean(shchangenotifyderegister(m_hshnotify)) then begin
      {$R-}
      m_hshnotify := 0;
      cotaskmemfree(m_pidldesktop);
      result := true;
      {$R-}
    end;
  end;
  
  procedure tform1.wmshellreg(var message: tmessage); //系统消息处理函数
var
  strpath1, strpath2: string;
  charpath: array[0..259] of char;
  pidlitem: pshnotifystruct;
  vPath,vFile:string;
  begin
    pidlitem := pshnotifystruct(message.wparam);
    //  获得系统消息相关得路径
  shgetpathfromidlist(pidlitem.dwitem1, charpath);
    strpath1 := charpath;
    shgetpathfromidlist(pidlitem.dwitem2, charpath);
    strpath2 := charpath;
    vPath:=ExtractFilePath(strPath1);
    vFile:=ExtractFileName(strPath1);
    if (message.lparam=shcne_create) and (vPath=(Label1.Caption+'')) then
    begin
      // memo1.lines.add(sheventname(strpath1, strpath2, message.lparam) + chr(13) + chr(10));
    if not AnsiContainsText(Memo1.Lines.Text,vFile) then
      memo1.lines.add(vFile);
    end;
  end;
  
  
  procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  begin
    //在程序退出的同时删除监视
  if boolean(m_pidldesktop) then
    shnotify_unregister;
    
  end;
  
  procedure TForm1.Button1Click(Sender: TObject);
  begin
    Memo1.Clear;
    m_hshnotify := 0;
    if shnotify_register(form1.handle) then begin //注册shell监视
    showmessage('shell监视程序成功注册');
      button1.enabled := false;
    end
    else
    showmessage('shell监视程序注册失败');
    
  end;
  
  procedure TForm1.Button2Click(Sender: TObject);
  var
  i:integer;
  begin
    i:=Memo1.Lines.IndexOf(Memo1.SelText);
    Memo1.Lines.Delete(i);
  end;
  
end.

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

来源:http://www.tulaoshi.com/n/20160219/1626333.html

延伸阅读
标签: windows系统
win8如何打开资源管理器?   win8系统快速打开资源管理器的技巧:win8系统资源管理器在哪里?win8资源管理器怎么打开?相信这是很多win8系统新手经常会问的问题,由于这款系统相对之前的win7系统有很大的变化,因此导致很多新用户比较陌生,不知道win8资源管理器怎么打开,其实方法很简单,下面就跟图老师小编一起来看看吧。 推荐...
标签: windows 操作系统
一直以来人们对Windows资源管理器(Windows Explorer)的功能和易用性都有所抱怨,于是就出现了很多第三方插件(它们通常会出现在Windows资源管理器的上下文菜单中)。在本文中,我们搜集了一些很好的Windows资源管理器插件,并将对它们的功能进行简单的介绍。 这些插件中包括用于播放音频文件的Winamp(www.winamp.com)、用于...
标签: 电脑入门
一开始试着直接把Win10的这台电脑的快捷方式拖到任务栏,但是单击打开计算机后,任务栏会多出一个资源管理器的图标。另外,使用创建快捷方式并指向explorer.exe,依然是这个效果。如下图所示: 不过这个问题已经被我解决啦,将我附件中提供的快捷方式固定到任务栏,就没有这个问题了。如下图 使用说明: 附件文件夹1中的快捷方式只能...
标签: 电脑入门
相对与Win 7系统让用户手动展开文件夹以及二级文件夹,不直接在前端展示,让我颇有微言。相信微软为了减少桌面凌乱才如此设计,但对于用户来说,却有点不方便。 让Win 7资源管理器自动展开文件夹的方法 不过,Windows 7的系统设置里有一项便捷操作,可以改进这种层层叠叠打开文件夹的方式,下面是操作步骤: 第一:启动资源管理器(推荐用户...
标签: 电脑入门
说windows 7游戏资源管理器相信很多人都不了解这个东西。当然个人感觉稍微了解下就行了,不建议去使用它。因为它在中国并不普及。那么接下来我们就简单了解windows 7游戏资源管理器吧! 1 windows 7游戏资源管理器简介: 游戏资源管理器跟我们的游戏平台一样,就像QQ游戏,QQ对战平台等之类的差不多。里面既有小游戏,也有一些比较大型的游...

经验教程

667

收藏

75
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部