首页 > 其他分享 >备份还原剪切板

备份还原剪切板

时间:2023-11-24 09:34:56浏览次数:36  
标签:begin end 备份 Clipboard 还原 剪切板 ClipList Data pcd

忘记是抄谁的了,这里改进了一下。还原后没有clear 并再一次备份。
因为还原一次后,如果再还原,会句柄无效的。

unit clipbak;
  
interface
uses  
  SysUtils, Classes, Clipbrd, Windows, Contnrs, Dialogs;
  
type
  TClipData = class
    Format: WORD;  
    Data: THANDLE;  
  end;  
  
  TClipBackuper = class  
  private  
    ClipList: TList;  
  public  
    constructor Create;  
    destructor Destroy; override;  
    procedure BackupClip();
    function RestoreClip:Boolean;
  end;  
  

implementation  


constructor TClipBackuper.Create;  
begin  
  Cliplist := TObjectList.Create;  
end;  
  
destructor TClipBackuper.Destroy;  
begin  
  ClipList.Free;  
end;     
  
procedure TClipBackuper.BackupClip;  
var  
  i: Integer;
  Data: THANDLE;  
  pcd: TClipData;  
  DataMem: Pointer;
  FileName : array [0..255] of Char;
  FileStr:string;
begin  
  ClipList.Clear;
  Clipboard.Open;
  try  
    for i := 0 to Clipboard.FormatCount - 1 do
    begin
      pcd := TClipData.Create;  

      pcd.Format := Clipboard.Formats[i];
      Data := THANDLE(Clipboard.GetAsHandle( pcd.Format));
//      GetClipboardFormatName(pcd.Format, FileName, 255);
//      FileStr := string(FileName);
//      OutputDebugString(pchar(FileStr));
      if (Data = 0) then
      begin
        pcd.free;
        continue;
      end;
      //分配内存
      pcd.Data := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, GlobalSize(Data));
      //锁定内存
      DataMem := GlobalLock(pcd.Data);
      //有分配成功的话,复制当前剪切板的内存数据
      if (DataMem <> nil) then
      begin
        CopyMemory(DataMem, GlobalLock(Data), GlobalSize(Data));
        //解锁
        GlobalUnlock(THANDLE(pcd.Data));
        GlobalUnlock(THANDLE(Data));
      end;
      ClipList.Add(pcd);
    end;  
  finally  
    Clipboard.Close;
  end;
end;


//还原回去后,要再一次backup 不然再RestoreClip 不会再一次还原不会成功
function TClipBackuper.RestoreClip:Boolean;
var  
  pcd: TClipData;  
  i: Integer;
begin  
  Clipboard.Open();  
  try
    Clipboard.Clear();  
    for i := 0 to ClipList.Count - 1 do  
    begin
      pcd := TClipData(ClipList[i]);
      if SetClipboardData(pcd.Format, pcd.Data) <= 0 then
      begin
       Result := False;
       Exit;
      end;
    end;
  finally
    Clipboard().Close();
  end;
  BackupClip; //再备份一次
  Result := True;
end;
  
end.

 

标签:begin,end,备份,Clipboard,还原,剪切板,ClipList,Data,pcd
From: https://www.cnblogs.com/BTag/p/17853009.html

相关文章

  • 行行AI直播:开除、斗殴、抢公章 | 商战真这么朴素?还原真实商战与权斗!
    提起商战,你脑海中会浮现什么样的画面?是两大集团风云人物,杀伐果断,有勇有谋,高手过招,最低限度起码得互相安插间谍,进行高科技窃密,高阶点直接上演“商业帝国三部曲”!还是隐身于幕后的神秘大佬轻声对身边的下属吩咐两句,各大金融市场上就立刻风云变幻?与大家想象中截然不同的是,现实生活中......
  • k8s定时备份与故障还原
    Kubernetesetcd定时备份及恢复方案原创 小小平头哥 小小平头哥 2023-11-2311:17 发表于山东收录于合集#云原生相关6个#kubernetes1个#k8s使用技巧3个#k8s5个点关注......
  • 数据库备份与恢复
    生产环境中,数据的安全性是至关重要的,任何数据的丢失都可能产生严重的后果造成数据丢失的原因:程序错误、误操作(占比最大)、计算机失败、磁盘失败、物理灾难选择备份的依据是:丢失数据的代价与确保数据不丢失的代价之比数据库备份分类物理与逻辑区分物理备份:指对数据库操作系......
  • PG如何备份数据库:
      备份数据::##单数据库:三种格式备份:pg_dump-bash-4.2$history|greppg_dump132023-11-2215:18:17postgrespg_dumpmydb>mydb.bak212023-11-2215:20:03postgrespg_dumpmydb>mydb.bak252023-11-2215:20:20postgrespg_dumpmydb>mydb.tar3......
  • 使用docker 搭建xtrabackup服务,实现mysql全量和增量备份
    根据前面的mysql备份调研得知,mysql的备份重头戏就是xtrabackup,mysqldump只能算开胃菜本篇就着重讨论下xtrabackup的使用,由于考虑到维持虚拟机环境的整洁,和搭建使用的通用和便利性,这里选择基于docker环境使用照惯例,学习任何一个工具最佳途径就是研读官方文档,这里贴出官方文档:http......
  • 使用docker 搭建xtrabackup服务,实现mysql全量和增量备份
    mysql数据库的备份是运维的重中之重,是保障服务灾难恢复的最后一道屏障在我的构想里,一个完备的mysql容灾体系应该包括高可用架构和一套基础的数据库备份方案高可用架构:MM+ Keepalived,PXC(PerconaXtraDBCluster)或者GR(GroupReplication),来保证故障恢复,并附带一个延迟备库(延迟1......
  • Jtti:云备份的意义
    进行云备份是数据管理和保护策略的重要组成部分,有多个原因支持这一做法:数据安全性:云备份提供了额外的数据安全层。在本地存储的数据可能会受到硬件故障、自然灾害、盗窃或其他意外事件的威胁。通过将备份存储在云中,数据得到了远程保护,即使本地发生问题,数据依然安全。容灾恢复:云备......
  • SQL Server数据库(自动、手动)备份
      数据库自动备份:1.首先需要启动SQLServerAgent服务,这个服务如果不启动是无法运行新建作业的。点击“开始”–“所有程序”–“MicrosoftSQLServer2008”–“启动SQLServerManagementStudio”登录数据库,点击管理–维护计划–右击维护计划向导如图所示:    ......
  • Navicat 密码还原
    <?phpnamespaceFatSmallTools;classNavicatPassword{protected$version=0;protected$aesKey='libcckeylibcckey';protected$aesIv='libccivlibcciv';protected$blowString='3DC5CA39';protecte......
  • 数据库备份——Xcopy详细参数
    @echooffnetuse\\IP\software/user:用户名"密码"xcopy/E/Y/D:11-20-2023"\\IP\software\*.txt""E:\data"pause重点关注/D参数,不是YYYY-MM-DD,而是MM-DD-YYYY XCOPY——目录复制命令 1.功能:复制指定的目录和目录下的所有文件连同目录结构。 2.类型:外部命令 3......