怎样监控剪贴板的数据发生变化,只要一改变就获取最新内容,我这里说的不是文本,而是文件,比如说,当我复制几个文件时,剪贴板内容肯定会变化,然后我怎样取出我所复制的那些文件的文件名(要全路径哦)呢,我在网上找的都是文本的,没有文件,怎么弄啊,请高手帮忙!

解决方案 »

  1.   

    可以参考拖拽的代码原理的差不多
    监控捕获我就不写了,关键代码user ShellApi;//........
    //SetClipboardViewer过程略
    /.........//当有数据变化
    var
    pGlobal  : Thandle;
    FileNumber,i:Integer;
    pData: array[0..MAX_PATH] of Char;
    begin
    OpenClipboard(self.Handle);
    pGlobal:=GetClipboardData(CF_HDROP); //获取剪贴板中的文件数据
    if pGlobal>0 then begin
      FileNumber := DragQueryFile(pGlobal,$FFFFFFFF,nil,0);  //得到文件数量
      for i:=0 to FileNumber-1 do begin
         Fillchar(pData,Sizeof(pData),0);
         DragQueryFile(pGlobal, i, @pData, Sizeof(pData));   //获得路径及文件名
         Memo1.Lines.Add(pData);
      end;
    end;
    CloseClipboard;
    end;
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Clipbrd, StdCtrls;type
      TForm1 = class(TForm)
        Memo1: TMemo;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
         NextViewerHandle : THandle;
         procedure WMDrawClipboard (var message : TMessage);message WM_DRAWCLIPBOARD;
         procedure WMChangeCBCHain (var message : TMessage); message WM_CHANGECBCHAIN;
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    begin
       NextViewerHandle := SetClipboardViewer(Handle);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
       ChangeClipboardChain(Handle, NextViewerHandle);
    end;procedure TForm1.WMDrawClipboard (var message : TMessage);
    begin
        message.Result := SendMessage(WM_DRAWCLIPBOARD, NextViewerHandle, 0, 0);
        if (Clipboard.HasFormat(CF_TEXT) or Clipboard.HasFormat(CF_OEMTEXT)) then
        begin
            Memo1.Clear;
            Memo1.Text:=Clipboard.asText;
        end;
    end;procedure TForm1.WMChangeCBCHain (var message : TMessage);
    begin
        if message.wParam = NextViewerHandle then
        begin
           NextViewerHandle := message.lParam;
           message.Result := 0;
        end else  begin 
           message.Result := SendMessage(NextViewerHandle, WM_CHANGECBCHAIN,message.wParam, message.lParam);
        end;
    end;end.