刷新桌面可以用 SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);那么刷新特定目录呢我要的是在目录内点击刷新的效果

解决方案 »

  1.   

    试试SHChangeNotify(SHCNE_UPDATEDIR,   SHCNF_IDLIST,   nil,   nil);
      

  2.   

     SHChangeNotify(SHCNE_UPDATEDIR,
                     SHCNF_PATH or SHCNF_IDLIST,
                     PChar('C:\Dir'),
                     NiL);
    看这样行不 
      

  3.   

    to sailxia
     
    你有什么好的方案to gyk120 模拟按键恐怕是不行的,因为日志目录并不打开
      

  4.   

    to sailxia
     
    如果按照你3楼说的,刷新目录这样做并不是一个好方法,你应该监视那个日志文件。我就是监控此文件改变才读取的,问题是有时候写入日志文件并不会改变,需要刷新下目录才会改变我是监控另一款程序的日志文件,所以对日志的输出处理是没有办法的我也尝试过用管道,但是却不能输出任何信息,利用DOS命令重定向到其他文件 也是不能输出任何信息没办法只能监控日志文件了,但是日志文件有时候必须手动刷新下才会更新。。所以我才问如何实现WINDOWS的右键刷新功能
      

  5.   

    根据你的需求,可以用ReadDirectoryChanges
      

  6.   

    ReadDirectoryChanges同样不行此段代码就是用ReadDirectoryChanges监控目录的同样不能监控到文件更改,必须刷新后才会监控到
      

  7.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls, Buttons;type
      TForm1 = class(TForm)
        lbEvents: TListBox;
        Label1: TLabel;
        ePath: TEdit;
        CJLabel1: TLabel;
        bStart: TButton;
        bStop: TButton;
        ckWatchSubTree: TCheckBox;
        ckMonitorFileName: TCheckBox;
        ckMonitorDirName: TCheckBox;
        ckMonitorAttributes: TCheckBox;
        ckMonitorSize: TCheckBox;
        ckMonitorLastWrite: TCheckBox;
        ckMonitorSecurity: TCheckBox;
        ckMonitorCreationDate: TCheckBox;
        ckMonitorLastAccess: TCheckBox;
        SpeedButton1: TSpeedButton;
        procedure bStartClick(Sender: TObject);
        procedure bStopClick(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure ePathDblClick(Sender: TObject);
      private
        FDirectoryHandle: THandle;
        FNotificationBuffer: array[0..4096] of Byte;
        FWatchThread: TThread;
        FNotifyFilter: DWORD;
        FOverlapped: TOverlapped;
        FPOverlapped: POverlapped;
        FBytesWritten: DWORD;
        FCompletionPort: THandle;
      public
      end;var
      Form1: TForm1;type
      PFileNotifyInformation = ^TFileNotifyInformation;
      TFileNotifyInformation = record
        NextEntryOffset: DWORD;
        Action: DWORD;
        FileNameLength: DWORD;
        FileName: array[0..0] of WideChar;
      end;const
      FILE_LIST_DIRECTORY   = $0001;const
      SAction: array[FILE_ACTION_ADDED..FILE_ACTION_RENAMED_NEW_NAME] of String =
      ( '增加-> %s',
        '删除-> %s',
        '访问-> %s',
        '改名-> %s [...]',
        '[...] 改为 %s');implementation{$R *.DFM}uses
      ShlObj, ActiveX;type
      TWaitThread = class(TThread)
      private
        FForm: TForm1;
        procedure HandleEvent;
      protected
        procedure Execute; override;
      public
        constructor Create(Form: TForm1);
      end;constructor TWaitThread.Create(Form: TForm1);
    begin
      inherited Create(True);
      FForm := Form;
      FreeOnTerminate := False;
    end;procedure TWaitThread.HandleEvent;
    var
      FileOpNotification: PFileNotifyInformation;
      Offset: Longint;
      s:Array[1..127] of char; i:DWord;
    begin
      Getcomputername(@s,i);
      with FForm do
      begin
        Pointer(FileOpNotification) := @FNotificationBuffer[0];
        repeat
          Offset := FileOpNotification^.NextEntryOffset;
          lbEvents.Items.Add(Format(SAction[FileOpNotification^.Action], [WideCharToString(@(FileOpNotification^.FileName))])+s);
          PChar(FileOpNotification) := PChar(FileOpNotification)+Offset;
        until Offset=0;
      end;
    end;procedure TWaitThread.Execute;
    var
      numBytes: DWORD;
      cbOffset: DWORD;
      CompletionKey: DWORD;
    begin
      while not Terminated do
      begin
        GetQueuedCompletionStatus( FForm.FCompletionPort, numBytes, CompletionKey, FForm.FPOverlapped, INFINITE);
        if CompletionKey <> 0 then
        begin
          Synchronize(HandleEvent);
          with FForm do
          begin
            FBytesWritten := 0;
            ZeroMemory(@FNotificationBuffer, SizeOf(FNotificationBuffer));
            ReadDirectoryChanges(FDirectoryHandle, @FNotificationBuffer, SizeOf(FNotificationBuffer), ckWatchSubTree.Checked, FNotifyFilter, @FBytesWritten, @FOverlapped, nil);
          end;
        end
        else
          Terminate;
      end;
    end;procedure TForm1.bStartClick(Sender: TObject);
    begin
      FNotifyFilter := 0;
      if ckMonitorFileName.Checked then
        FNotifyFilter := FNotifyFilter or FILE_NOTIFY_CHANGE_FILE_NAME;
      if ckMonitorDirName.Checked then
        FNotifyFilter := FNotifyFilter or FILE_NOTIFY_CHANGE_DIR_NAME;
      if ckMonitorAttributes.Checked then
        FNotifyFilter := FNotifyFilter or FILE_NOTIFY_CHANGE_ATTRIBUTES;
      if ckMonitorSize.Checked then
        FNotifyFilter := FNotifyFilter or FILE_NOTIFY_CHANGE_SIZE;
      if ckMonitorLastWrite.Checked then
        FNotifyFilter := FNotifyFilter or FILE_NOTIFY_CHANGE_LAST_WRITE;
      if ckMonitorLastAccess.Checked then
        FNotifyFilter := FNotifyFilter or FILE_NOTIFY_CHANGE_LAST_ACCESS;
      if ckMonitorCreationDate.Checked then
        FNotifyFilter := FNotifyFilter or FILE_NOTIFY_CHANGE_CREATION;
      if ckMonitorSecurity.Checked then
        FNotifyFilter := FNotifyFilter or FILE_NOTIFY_CHANGE_SECURITY;
      if FNotifyFilter = 0 then
      begin
         ShowMessage(请选择监视内容!');
         exit;
      end;
      lbEvents.Clear;
      FDirectoryHandle := CreateFile(PChar(ePath.Text),
        FILE_LIST_DIRECTORY,
        FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
        nil,
        OPEN_EXISTING,
        FILE_FLAG_BACKUP_SEMANTICS or FILE_FLAG_OVERLAPPED,
        0);
      if FDirectoryHandle = INVALID_HANDLE_VALUE then
      begin
        beep;
        FDirectoryHandle := 0;
        ShowMessage(SysErrorMessage(GetLastError));
        exit;
      end;
      FCompletionPort := CreateIoCompletionPort(FDirectoryHandle, 0, Longint(pointer(self)), 0);
      ZeroMemory(@FNotificationBuffer, SizeOf(FNotificationBuffer));
      FBytesWritten := 0;
      if not ReadDirectoryChanges(FDirectoryHandle, @FNotificationBuffer, SizeOf(FNotificationBuffer), ckWatchSubTree.Checked, FNotifyFilter, @FBytesWritten, @FOverlapped, nil) then
      begin
        CloseHandle(FDirectoryHandle);
        FDirectoryHandle := 0;
        CloseHandle(FCompletionPort);
        FCompletionPort := 0;
        ShowMessage(SysErrorMessage(GetLastError));
        exit;
      end;
      ePath.Enabled := False;
      bStart.Enabled := False;
      bStop.Enabled := True;
      FWatchThread := TWaitThread.Create(self);
      TWaitThread(FWatchThread).Resume;
    end;procedure TForm1.bStopClick(Sender: TObject);
    begin
      if FCompletionPort = 0 then
        exit;
      PostQueuedCompletionStatus(FCompletionPort, 0, 0, nil);
      FWatchThread.WaitFor;
      FWatchThread.Free;
      CloseHandle(FDirectoryHandle);
      FDirectoryHandle := 0;
      CloseHandle(FCompletionPort);
      FCompletionPort := 0;
      ePath.Enabled := True;
      bStart.Enabled := True;
      bStop.Enabled := False;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      bStop.Click;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      FCompletionPort := 0;
      FDirectoryHandle := 0;
      FPOverlapped := @FOverlapped;
      ZeroMemory(@FOverlapped, SizeOf(FOverlapped));
    end;procedure TForm1.ePathDblClick(Sender: TObject);
    var
      SelectionPIDL: PItemIDList;
      BrowseInfo: TBrowseInfo;
      ShellAllocator: IMalloc;
      PathBuffer: array[0..MAX_PATH] of Char;
    begin
      // simplest implementation of BrowseForFolder
      excellent site www.delphifreestuff.com
      ZeroMemory(@BrowseInfo, SizeOf(BrowseInfo));
      BrowseInfo.hwndOwner := Handle;
      BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
      CoInitialize(nil);
      try
        SelectionPIDL := ShBrowseForFolder(BrowseInfo);
        if SelectionPIDL <> nil then
        try
          ZeroMemory(@PathBuffer, SizeOf(PathBuffer));
          if not SHGetPathFromIDList(SelectionPIDL, @PathBuffer) then
          begin
            beep;
            exit;
          end;
          ePath.Text := StrPas(@PathBuffer[0]);
        finally
          if SHGetMalloc(ShellAllocator) = 0 then
          begin
            ShellAllocator.Free(SelectionPIDL);
            ShellAllocator := nil;
          end;
        end;
      finally
        CoUnInitialize;
      end;
    end;end.
      

  8.   

    安装个 CNVCL,里面的文件监控,有例子,很好用。