DELPHI 能不能实现程序私有的剪贴板?
即调用一个剪贴板,但这个剪贴板非系统那个。
因为我要剪贴板来保存一些数据
但如果系统剪贴板已有存在东西的话,那么我的操作将会令系统剪贴板的东西丢失。

解决方案 »

  1.   

    自己建个动态数组或者List保存内容不就可以了吗
      

  2.   

    貌似很难,hookapi来处理你的程序来的数据, 截获来源判断。
      

  3.   

    1、程序自己改造ctrl-c/v的事件,改为存所选到程序的数据区
    2、还是利用系统剪贴板,c前先保存系统剪贴板的内容,v后恢复系统剪贴板的内容
      

  4.   

    保存到record中或缓冲中可行吗?
      

  5.   


    网上搜到的,不是我写的uses clipbrd;procedure CopyStreamToClipboard(fmt: Cardinal; S: TStream);
    var
    hMem: THandle;
    pMem: Pointer;
    begin
      Assert(Assigned(S));
      S.Position := 0;
      hMem := GlobalAlloc(GHND or GMEM_DDESHARE, S.Size);
      if hMem <> 0 then
      begin
        pMem := GlobalLock(hMem);
        if pMem <> nil then
        begin
          try
            S.Read(pMem^, S.Size);
            S.Position := 0;
            finally
              GlobalUnlock(hMem);
            end;
            Clipboard.Open;
            try
              Clipboard.SetAsHandle(fmt, hMem);
              finally
                Clipboard.Close;
              end;
            end { If }
            else
            begin
              GlobalFree(hMem);
              OutOfMemoryError;
            end;
          end { If }
          else
          OutOfMemoryError;
        end; { CopyStreamToClipboard }
        
        procedure CopyStreamFromClipboard(fmt: Cardinal; S: TStream);
        var
        hMem: THandle;
        pMem: Pointer;
        begin
          Assert(Assigned(S));
          hMem := Clipboard.GetAsHandle(fmt);
          if hMem <> 0 then
          begin
            pMem := GlobalLock(hMem);
            if pMem <> nil then
            begin
              try
                S.Write(pMem^, GlobalSize(hMem));
                S.Position := 0;
                finally
                  GlobalUnlock(hMem);
                end;
              end { If }
              else
              raise Exception.Create('CopyStreamFromClipboard: could not lock global handle' +
              'obtained from clipboard!');
            end; { If }
          end; { CopyStreamFromClipboard }
          
          procedure SaveClipboardFormat(fmt: Word; writer: TWriter);
          var
          fmtname: array[0..128] of Char;
          ms: TMemoryStream;
          begin
            Assert(Assigned(writer));
            if 0 = GetClipboardFormatName(fmt, fmtname, SizeOf(fmtname)) then
            fmtname[0] := #0;
            ms := TMemoryStream.Create;
            try
              CopyStreamFromClipboard(fmt, ms);
              if ms.Size > 0 then
              begin
                writer.WriteInteger(fmt);
                writer.WriteString(fmtname);
                writer.WriteInteger(ms.Size);
                writer.Write(ms.Memory^, ms.Size);
              end; { If }
              finally
                ms.Free
              end; { Finally }
            end; { SaveClipboardFormat }
            
            procedure LoadClipboardFormat(reader: TReader);
            var
            fmt: Integer;
            fmtname: string;
            Size: Integer;
            ms: TMemoryStream;
            begin
              Assert(Assigned(reader));
              fmt := reader.ReadInteger;
              fmtname := reader.ReadString;
              Size := reader.ReadInteger;
              ms := TMemoryStream.Create;
              try
                ms.Size := Size;
                reader.Read(ms.memory^, Size);
                if Length(fmtname) > 0 then
                fmt := RegisterCLipboardFormat(PChar(fmtname));
                if fmt <> 0 then
                CopyStreamToClipboard(fmt, ms);
                finally
                  ms.Free;
                end; { Finally }
              end; { LoadClipboardFormat }          procedure SaveClipboard(S: TStream);
              var
              writer: TWriter;
              i: Integer;
              begin
                Assert(Assigned(S));
                writer := TWriter.Create(S, 4096);
                try
                  Clipboard.Open;
                  try
                    writer.WriteListBegin;
                    for i := 0 to Clipboard.formatcount - 1 do
                    SaveClipboardFormat(Clipboard.Formats[i], writer);
                    writer.WriteListEnd;
                    finally
                      Clipboard.Close;
                    end; { Finally }
                    finally
                      writer.Free
                    end; { Finally }
                  end; { SaveClipboard }
                  
                  procedure LoadClipboard(S: TStream);
                  var
                  reader: TReader;
                  begin
                    Assert(Assigned(S));
                    reader := TReader.Create(S, 4096);
                    try
                      Clipboard.Open;
                      try
                        clipboard.Clear;
                        reader.ReadListBegin;
                        while not reader.EndOfList do
                        LoadClipboardFormat(reader);
                        reader.ReadListEnd;
                        finally
                          Clipboard.Close;
                        end; { Finally }
                        finally
                          reader.Free
                        end; { Finally }
                      end; { LoadClipboard }procedure TForm1.Button2Click(Sender: TObject);
    begin
                          clipboard.Clear;end;procedure TForm1.Button3Click(Sender: TObject);
                        var
                        fs: TfileStream;
                        begin
                          fs := TFilestream.Create('c:\temp\ClipBrdSaved.dat',
                          fmopenread or fmsharedenynone);
                          try
                            LoadClipboard(fs);
                            finally
                              fs.Free;
                            end; { Finally }
                          end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
                      ms: TMemoryStream;
                      begin
                        ms := TMemoryStream.Create;
                        try
                          SaveClipboard(ms);
                          ms.SaveToFile('c:\temp\ClipBrdSaved.dat');
                          finally
                            ms.Free;
                          end; { Finally }
    end;
      

  6.   

    再加上这段就是我想要的效果了,谢谢各位朋友,尤其是12楼的执心帮助!谢谢.
     private
        { Private declarations }
        MyBitmap:TBitmap;var error:integer;
    begin
      MyBitmap:=TBitmap.Create;
      try
        MyBitmap.Width:=0;
        MyBitmap.Height:=0;
      except
        Application.Terminate;
      end;
     If Clipboard.HasFormat(CF_BITMAP) Then
       begin
        MyBitmap.Assign(Clipboard);
         Invalidate;
        If Not MyBitmap.Empty Then
         try   
           MyBitmap.SaveToFile(bmpname);
          except
              error:=error+1;
              messagebox(0,'文件名不正确或磁盘空间不够','注意',mb_iconstop);
              if error>10 then
              Application.Terminate;
          end;
      end;
    end;