剪贴板的流存储

原创 2004年03月25日 17:21:00
(*//
标题:剪贴板的流存储
说明:如果你想借用剪贴板,有这套函数就方便了
设计:Zswang
日期:2003-11-14
支持:wjhu111@21cn.com
//*)

///////Begin Source
uses Clipbrd;

type
  TDataIdnet = array[0..2] of Char;
  TClipboardFileHead = packed record
    rIdent: TDataIdnet;
    rCount: Word;
  end;

  TClipboardFileItem = packed record
    rFormat: Word;
    rSize: Longword;
    rData: Pointer;
  end;

const rDataIdnet: TDataIdnet = 'cbf';

function ClipboardSaveToStream(mStream: TStream): Boolean;
var
  vClipboardFileHead: TClipboardFileHead;
  vClipboardFileItem: TClipboardFileItem;
  I: Integer;
  vData: THandle;
begin
  Result := False;
  if not Assigned(mStream) then Exit;
  vClipboardFileHead.rIdent := rDataIdnet;
  vClipboardFileHead.rCount := Clipboard.FormatCount;
  mStream.Write(vClipboardFileHead, SizeOf(vClipboardFileHead));
  try
    Clipboard.Open;
    for I := 0 to Clipboard.FormatCount - 1 do begin
      vData := GetClipboardData(Clipboard.Formats[I]);
      vClipboardFileItem.rFormat := Clipboard.Formats[I];
      vClipboardFileItem.rSize := GlobalSize(vData);
      vClipboardFileItem.rData := GlobalLock(vData);
      try
        mStream.Write(vClipboardFileItem, SizeOf(vClipboardFileItem) -
          SizeOf(vClipboardFileItem.rData));
        mStream.Write(vClipboardFileItem.rData^, vClipboardFileItem.rSize);
      finally
        GlobalUnlock(vData);
      end;
    end;
  finally
    Clipboard.Close;
  end;
  Result := True;
end; { ClipboardSaveToStream }

function ClipboardLoadFromStream(mStream: TStream): Boolean;
var
  vClipboardFileHead: TClipboardFileHead;
  vClipboardFileItem: TClipboardFileItem;
  I: Integer;
  vData: THandle;
begin
  Result := False;
  if not Assigned(mStream) then Exit;
  if mStream.Size <= SizeOf(vClipboardFileHead) then Exit;
  mStream.Read(vClipboardFileHead, SizeOf(vClipboardFileHead));
  if vClipboardFileHead.rIdent <> rDataIdnet then Exit;
  Clipboard.Clear;
  Clipboard.Open;
  try
    for I := 0 to vClipboardFileHead.rCount - 1 do begin
      mStream.Read(vClipboardFileItem, SizeOf(vClipboardFileItem) -
        SizeOf(vClipboardFileItem.rData));
      vData := GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE,
        vClipboardFileItem.rSize);
      try
        vClipboardFileItem.rData := GlobalLock(vData);
        try
          mStream.Read(vClipboardFileItem.rData^, vClipboardFileItem.rSize);
          SetClipboardData(vClipboardFileItem.rFormat, vData);
        finally
          GlobalUnlock(vData);
        end;
      finally
        GlobalFree(vData);
      end;
    end;
  finally
    Clipboard.Close;
  end;
  Result := True;
end; { ClipboardLoadFromStream }
///////End Source

///////Begin Demo
procedure TFormClipboard.ButtonSaveClick(Sender: TObject);
var
  vMemoryStream: TMemoryStream;
begin
  if not SaveDialog1.Execute then Exit;
  if FileExists(SaveDialog1.FileName) and
    (MessageDlg(Format('是否覆盖文件 "%s"?', [SaveDialog1.FileName]),
    mtWarning, [mbYes, mbNo], 0) <> mrYes) then Exit;
  vMemoryStream := TMemoryStream.Create;
  try
    ClipboardSaveToStream(vMemoryStream);
    vMemoryStream.SaveToFile(SaveDialog1.FileName);
  finally
    vMemoryStream.Free;
  end;
end;

procedure TFormClipboard.ButtonLoadClick(Sender: TObject);
var
  vMemoryStream: TMemoryStream;
begin
  if not OpenDialog1.Execute then Exit;
  if not FileExists(OpenDialog1.FileName) then Exit;
  vMemoryStream := TMemoryStream.Create;
  try
    vMemoryStream.LoadFromFile(OpenDialog1.FileName);
    ClipboardLoadFromStream(vMemoryStream);
  finally
    vMemoryStream.Free;
  end;
end;
///////End Demo

Windows 剪切板API详解

剪切、复制、粘贴都是我们在操作电脑的时候经常会用到的功能。但是你知道当我们剪切或者复制的 时候,数据会保存到什么地方吗?当我们粘贴的时候,又是从什么地方将数据输出出来呢?这都源自于系统中给我们提供了一...
  • dyllove98
  • dyllove98
  • 2013年06月01日 21:12
  • 5300

android开发 -- 复制文本内容到系统剪贴板(自由复制)

直接上代码:(对应的类:android.content.ClipboardManager) //获取剪贴板管理器: Clipboard...
  • qq_22078107
  • qq_22078107
  • 2016年12月03日 21:42
  • 9097

Android剪贴板的妙用

Clipboard还能玩出花 Clipboard是Android提供的一个系统服务,它提供了一个全局的剪贴板,让文字、图片、数据,在多App间共享成为可能,今天,我们来了解下它的真面目,以及...
  • liranke
  • liranke
  • 2016年11月18日 17:59
  • 1623

C# 图片存储到剪贴板

  • 2010年02月26日 11:28
  • 2KB
  • 下载

C# 图片存储到剪贴板里

  • 2010年03月17日 14:16
  • 1KB
  • 下载

c#实现Windows剪贴板监视器

Windows剪贴板剪贴板(ClipBoard)是内存中的一块区域,是Windows内置的一个非常有用的工具,通过小小的剪贴板,架起了一座彩桥,使得在各种应用程序之间,传递和共享信息成为可能。然而美中...
  • testcs_dn
  • testcs_dn
  • 2015年01月03日 18:18
  • 6507

JS实现各种复制到剪贴板

一、实现点击按钮,复制文本框中的的内容                         script type="text/javascript"...
  • fanhu6816
  • fanhu6816
  • 2016年10月13日 19:25
  • 13832

javascript实现的复制到剪贴板

“复制到剪贴板”功能是我们每天都用几十次的功能,但是客户端API一直都很缺乏,一些较旧的API和浏览器实现需要一个可怕的“你确定?” - 风格的对话之前,内容将被复制到剪贴板 - 不适合可用性或信任。...
  • yilanyoumeng3
  • yilanyoumeng3
  • 2018年01月06日 11:23
  • 86

点击按钮复制到剪贴板 js

Document function jsCopy(){ var e=document.getElementById(...
  • u014796999
  • u014796999
  • 2016年07月11日 02:11
  • 10023

js实现复制到剪贴板功能,兼容所有浏览器

前段时间做项目的时候,有点击按钮复制文本的需求,想使用操作windows剪切板实现,在网上查了些资料,发现目前好像只有IE支持直接访问剪切板,实现需求的时候也只做了IE中的点击复制功能,其余浏览器: ...
  • Goskalrie
  • Goskalrie
  • 2016年07月29日 14:21
  • 6771
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:剪贴板的流存储
举报原因:
原因补充:

(最多只允许输入30个字)