天,发什么样的消息?发了我怎么在C端去响应呢?用hook?不会吧,我一点都不懂那个的;
这可是跨进程的啊。

解决方案 »

  1.   

    现在我程序中的问题已经解决了,用了个笨方法...不断读取目标文件的修改时间。
    本来想搞个象Winzip那样的实现,把包里的文件打开并修改后能自动检测是否修改,并提示保存,可真做起来...就没有人指点我别的方法吗?
    高手在哪啊????
      

  2.   

    可以SHChangeNotify函数试试?!!!................
     
      

  3.   

    spiritnet老兄?
    怎么响应这个函数选出的系统消息呢?我SDK一点基础都没有。
      

  4.   

    spiritnet老兄?
    怎么响应这个函数选出的系统消息呢?SDK,我一点基础都没有。
      

  5.   

    能不能说明白点,应当可以用进程之间的通信,象命名管道,socket
      

  6.   

    一个笨方法是首先获得S端进程的句柄,在C端运行一个后台线程,监测S端的句柄,当S端被关闭后,句柄值消失。令一方法我也不清楚好象是DEBUG涵数,你找DEBUG FUNCTION这是系统给定的,装载后可用了。
      

  7.   

    如楼上的老兄所说,还是要用HOOK,不然就显得很傻了。你怎么不早点来啊?我的分全给光了。
      

  8.   

    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.