SHChangeNotify用法详见SDK,捕捉文件改变的消息用 function SHChangeNotifyRegister(hWnd,uFlags,dwEventID,uMsg,dwItems:LongWord;lpps:PIDLSTRUCT):integer; 其中dwEventID参数意义与SHChangeNotify的dwEventID同.其余见以下代码(只是简单示意) 至于要知道(S端)在用户使用后被关闭了或许可用这种认为: 既然是S端,那肯定回响应C端请求,C端每隔一段时间向S端发出请求,若没回应不就说明S端被关闭了 unit notify; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,shlobj,Activex; const WM_SHNOTIFY=WM_USER+$813; type TTNOTIFY = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure WMSHNotify (var uMsg:TMessage);message WM_SHNOTIFY; procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end; type PSHNOTIFYSTRUCT=^SHNOTIFYSTRUCT; SHNOTIFYSTRUCT=record dwItem1:PItemIDList; dwItem2:PItemIDList; end; type PIDLSTRUCT=^IDLSTRUCT; IDLSTRUCT=record pidl:PItemIDList; bWatchSubFolder:integer; end; function SHNotify_Register(hWnd:Integer):bool; function SHNotify_Deregister:bool; function SHChangeNotifyDeregister(hNotify:Integer):integer;stdcall;external 'shell32.dll' index 4; function SHChangeNotifyRegister(hWnd,uFlags,dwEventID,uMsg,dwItems:LongWord;lpps:PIDLSTRUCT):integer; stdcall;external 'shell32.dll' index 2;var TNOTIFY: TTNOTIFY; m_hSHNotify:integer; m_pidlDesktop:PItemIDList;implementation{$R *.DFM} function SHNotify_Register(hWnd:Integer):bool; var ps:IDLSTRUCT; begin result:=false; if m_hSHNotify=0 then begin if (SHGetSpecialFolderLocation(0,CSIDL_DESKTOP,m_pidlDesktop)<>NOERROR) then exit; if Boolean(m_pidlDesktop) then begin ps.bWatchSubFolder:=1; ps.pidl:=m_pidlDesktop; m_hSHNotify:=SHChangeNotifyRegister(hWnd,($FF or 0),($7FFFFFFF or $80000000),WM_SHNOTIFY,1,@ps); result:=Boolean(m_hSHNotify); end else CoTaskMemFree(m_pidlDesktop); end; end; function SHNotify_Deregister:bool; begin result:=false; if Boolean(m_hSHNotify) then if Boolean(SHChangeNotifyDeregister(m_hSHNotify)) then begin m_hSHNotify:=0; CoTaskMemFree(m_pidlDesktop); result:=true; end; end;procedure TTNOTIFY.Button1Click(Sender: TObject); begin if Boolean(m_hSHNotify) then begin if SHNotify_Deregister then begin Button1.Caption:='打开监视'; memo1.Lines.Add('关闭监视成功.'); end else memo1.Lines.Add('关闭监视失败.'); end else begin if SHNotify_Register(Self.Handle) then begin Button1.Caption:='关闭监视'; memo1.Lines.Add('打开监视成功.'); end else memo1.Lines.Add('打开监视失败.'); end; end; procedure TTNOTIFY.WMSHNotify (var uMsg:TMessage); var lpszText:array [0..MAX_PATH] of char; pidlItem:PSHNOTIFYSTRUCT; begin pidlItem:=PSHNOTIFYSTRUCT(uMsg.wParam); SHGetPathFromIDList(pidlItem.dwItem1,lpszText); memo1.Lines.Add('文件:'+lpszText+'已改变'+#13#10); end; procedure TTNOTIFY.FormClose(Sender: TObject; var Action: TCloseAction); begin SHNotify_Deregister; end;end.
本来想搞个象Winzip那样的实现,把包里的文件打开并修改后能自动检测是否修改,并提示保存,可真做起来...就没有人指点我别的方法吗?
高手在哪啊????
怎么响应这个函数选出的系统消息呢?我SDK一点基础都没有。
怎么响应这个函数选出的系统消息呢?SDK,我一点基础都没有。
function SHChangeNotifyRegister(hWnd,uFlags,dwEventID,uMsg,dwItems:LongWord;lpps:PIDLSTRUCT):integer;
其中dwEventID参数意义与SHChangeNotify的dwEventID同.其余见以下代码(只是简单示意)
至于要知道(S端)在用户使用后被关闭了或许可用这种认为:
既然是S端,那肯定回响应C端请求,C端每隔一段时间向S端发出请求,若没回应不就说明S端被关闭了
unit notify;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,shlobj,Activex;
const WM_SHNOTIFY=WM_USER+$813;
type
TTNOTIFY = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure WMSHNotify (var uMsg:TMessage);message WM_SHNOTIFY;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
type PSHNOTIFYSTRUCT=^SHNOTIFYSTRUCT;
SHNOTIFYSTRUCT=record
dwItem1:PItemIDList;
dwItem2:PItemIDList;
end;
type PIDLSTRUCT=^IDLSTRUCT;
IDLSTRUCT=record
pidl:PItemIDList;
bWatchSubFolder:integer;
end;
function SHNotify_Register(hWnd:Integer):bool;
function SHNotify_Deregister:bool;
function SHChangeNotifyDeregister(hNotify:Integer):integer;stdcall;external 'shell32.dll' index 4;
function SHChangeNotifyRegister(hWnd,uFlags,dwEventID,uMsg,dwItems:LongWord;lpps:PIDLSTRUCT):integer;
stdcall;external 'shell32.dll' index 2;var
TNOTIFY: TTNOTIFY;
m_hSHNotify:integer;
m_pidlDesktop:PItemIDList;implementation{$R *.DFM}
function SHNotify_Register(hWnd:Integer):bool;
var
ps:IDLSTRUCT;
begin
result:=false;
if m_hSHNotify=0 then begin
if (SHGetSpecialFolderLocation(0,CSIDL_DESKTOP,m_pidlDesktop)<>NOERROR) then exit;
if Boolean(m_pidlDesktop) then begin
ps.bWatchSubFolder:=1;
ps.pidl:=m_pidlDesktop;
m_hSHNotify:=SHChangeNotifyRegister(hWnd,($FF or 0),($7FFFFFFF or $80000000),WM_SHNOTIFY,1,@ps);
result:=Boolean(m_hSHNotify);
end
else CoTaskMemFree(m_pidlDesktop);
end;
end;
function SHNotify_Deregister:bool;
begin
result:=false;
if Boolean(m_hSHNotify) then
if Boolean(SHChangeNotifyDeregister(m_hSHNotify)) then begin
m_hSHNotify:=0;
CoTaskMemFree(m_pidlDesktop);
result:=true;
end;
end;procedure TTNOTIFY.Button1Click(Sender: TObject);
begin
if Boolean(m_hSHNotify) then begin
if SHNotify_Deregister then begin
Button1.Caption:='打开监视';
memo1.Lines.Add('关闭监视成功.');
end
else memo1.Lines.Add('关闭监视失败.');
end else begin
if SHNotify_Register(Self.Handle) then begin
Button1.Caption:='关闭监视';
memo1.Lines.Add('打开监视成功.');
end
else memo1.Lines.Add('打开监视失败.');
end;
end;
procedure TTNOTIFY.WMSHNotify (var uMsg:TMessage);
var
lpszText:array [0..MAX_PATH] of char;
pidlItem:PSHNOTIFYSTRUCT;
begin
pidlItem:=PSHNOTIFYSTRUCT(uMsg.wParam);
SHGetPathFromIDList(pidlItem.dwItem1,lpszText);
memo1.Lines.Add('文件:'+lpszText+'已改变'+#13#10);
end;
procedure TTNOTIFY.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SHNotify_Deregister;
end;end.