保存恢复-c# Clipboard操作。如何保存剪贴板内容,在操作完成后恢复内容

问题描述

c# Clipboard操作。如何保存剪贴板内容,在操作完成后恢复内容

看过别人的方法,将各种数据分类读取到数据,占用剪贴板完成后再分类保存。但这种方法存在问题。因为C#的剪贴板读取和保存数据类型是有限的,如果对于一些用户自定义书记的剪贴板或者其他程序的自定义数据。操作后是不能如实恢复剪贴板的。

别人的例子程序。
object xx = null;
string ctype = "";
try
{
if (Clipboard.ContainsText())
{
ctype = "Text";
xx = Clipboard.GetText();
}
else if (Clipboard.ContainsFileDropList())
{
ctype = "FileDrop";
xx = Clipboard.GetFileDropList();
}
。。。。。。。。。。。。。。。

想要达到的效果。
data=clipboard.get....
占用剪贴板。。。。。
clipboard.set.....(data);
前后data数据不会改变。请问该如何实现

解决方案

在c#中试了一下,有些问题,建议你参考这个c++builder写的代码

 #include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <clipbrd.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
TList* ClipList = new TList;

struct ClipData
{
    WORD Format;
    HANDLE Data;

    ClipData() { Format = 0;  Data = NULL; }
   ~ClipData() { if (Data) GlobalFree(Data); }
};

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
    for(int n=0; n<ClipList->Count; n++) {
        delete (ClipData*)ClipList->Items[n];
    }
    ClipList->Clear();  delete ClipList;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SaveClipBtnClick(TObject *Sender)
{
    HANDLE Data;
    ClipData* pcd;

    for(int n=0; n<ClipList->Count; n++) {
        delete (ClipData*)ClipList->Items[n];
    }
    ClipList->Clear(); Clipboard()->Open();
    for(int n=0; n<Clipboard()->FormatCount;
        n++) {
        if ((pcd=new ClipData) == NULL)
            break;
        pcd->Format = Clipboard()->Formats[n];
        Data = (HANDLE)Clipboard()->GetAsHandle(
            pcd->Format);
        if (Data == NULL) {
            delete pcd;  continue;
        }
        pcd->Data = GlobalAlloc(GMEM_MOVEABLE|
            GMEM_DDESHARE, GlobalSize(Data));
        void* DataMem = GlobalLock(pcd->Data);
        if (DataMem != NULL) {
            memcpy(DataMem, GlobalLock(Data),
                GlobalSize(Data));
            GlobalUnlock((HANDLE)pcd->Data);
            GlobalUnlock((HANDLE)Data);
        }
        ClipList->Add(pcd);  continue;
    }
    Clipboard()->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RestoreClipBtnClick(TObject *Sender)
{
    HANDLE Data;
    ClipData* pcd;

    Clipboard()->Open();
    Clipboard()->Clear();
    for(int n=0; n<ClipList->Count; n++) {
        ClipData* pcd = (ClipData*)ClipList
            ->Items[n];
        SetClipboardData(pcd->Format, pcd->
            Data);
        pcd->Data = NULL;  delete pcd;
    }
    ClipList->Clear(); Clipboard()->Close();
}

解决方案二:

Clipboard.GetDataObject
Clipboard.SetDataObject

解决方案三:

IDataObject iData = Clipboard.GetDataObject();

//对剪切板进行处理

Clipboard.SetDataObject(iData)

时间: 2025-01-24 15:48:14

保存恢复-c# Clipboard操作。如何保存剪贴板内容,在操作完成后恢复内容的相关文章

爱思助手刷机后恢复备忘录失败怎么办

  如果你是在ios9以下系统时用爱思助手备份了备忘录,然后刷机到ios系统时,再恢复备份就会提示恢复失败,因为ios9备忘录升级后,与老版的不兼容了恢复不回去的,只要刷完ios9后先不升级新版备忘录,用爱思助手恢复备忘录还是可以. 但是如果你是不保留用户资料升级或者已经升级到新版的备忘录,那么就无法恢复回去了. 爱思助手刷机后恢复备忘录失败怎么办? 第一种方法就是,找台ios9系统以下的设备把备忘录文件恢复回去,再把他复制到电脑中. 如果你没有多余的设备,那么可以用第二种方法: 1.找到你的备

js操作cookie保存浏览记录的方法_javascript技巧

本文实例讲述了js操作cookie保存浏览记录的方法.分享给大家供大家参考,具体如下: 说明:最近做了一个功能,记录用户浏览过的产品页面.我的思路是,客户每次进入产品页面,就自己调用JS把产品信息以json的形式保存到cookie里面. 浏览记录的显示是从cookie里读出来,然后解析成json,生成html元素.因为用户可能会同时打开好几个页面,这几个页面上可能都有浏览记录,为了使即使显示浏览记录,每秒中刷新一次. 要用到2个js文件,history.js,关键的聊天记录保存和读取代码.jso

谁能给我一个表单提交的网站程序,asp的,最好能把用户提交的资料保存在一网页上,而且用户点击确实提交后,跳转到的网页是自己任意设置的

问题描述 谁能给我一个表单提交的网站程序,asp的,最好能把用户提交的资料保存在一网页上,而且用户点击确实提交后,跳转到的网页是自己任意设置的 解决方案 解决方案二:这个自己写1个很简单啊,貌似现成的没有,表单字段都是灵活的啊,没法有固定的模板!

要保存 httpwebresponse里面的字节流怎么保存 ?

问题描述 要保存 httpwebresponse里面的字节流怎么保存 ? 要保存 httpwebresponse里面的字节流怎么保存 ? 解决方案 resStream = response.GetResponseStream(); byte[] data = resStream.ToArray(); File.WriteAllBytes("文件名", data);

需要将PPT保存为图片怎么办 PPT怎么保存为图片

在PPT中,点击"另存为",在弹出的窗口中的"保存类型"处,点击下拉菜单选择"JPEG文件交换格式",在弹出窗口中选择"每张幻灯片",即可将PPT的内容变为多张图片保存下来.然后点击"另存为"进行保存,保存类型选择为"JPEG格式"即可.      

ps崩溃怎么防止 photoshop崩溃后恢复文件教程

photoshop崩溃怎么防止 方法一:清理你的电脑 Photoshop能否流畅运转,很大程度上取决于你的电脑有多大的可用空间.先检查一下你的硬盘空间,看看还剩多少可用空间.删除一些文件,或者将它们移动到另外的外接硬盘中.   方法二:限制你的工作量 你会同时打开多个工作窗口吗?当你不再会用到一些工作窗口时,你可以先关掉它们,以防它们拖慢PS的速度,甚至导致PS崩溃. 当然,如果你的作品中用了许多的图层,那这个方法同样适用.不少数码艺术家都习惯用许多甚至上百个图层来创作他们的作品.为了不让PS变

Discuz!3.2论坛版块被误删除后恢复方法

前几天由于自己的操作失误,将论坛板块给删除了,Discuz!后台版块被删除后是无法恢复的,如下图: 板块删除 想了一下,我用的是阿里云ESC服务器,应该有快照保存的,本人没有每天备份的习惯,打开阿里云后台看见我在5月1日居然保存了快照,但又不能直接恢复到5月1日,到今天可就差3天时间啊,不能全部快照回滚,所以就开始数据恢复旅程!如下图: 阿里云快照 第一:必须先保存现在当前时间的数据,有用户量的话最好在晚上11后开始操作,避免用户数据丢失! 接下来,就是操作了,要找到被删除版块数据,操作--->

jsp 网站开发-JAVA WEB应用,一个操作只能同时有一个用户操作

问题描述 JAVA WEB应用,一个操作只能同时有一个用户操作 一个B/S系统,其中有个调用Linux脚本的操作,执行时间较长,要求系统只能同时有一个用户执行此操作,否则提示其他用户正在执行,请问下该如何实现呢? 解决方案 在該腳本開頭添加"ps -ef | grep 'yourshell'",返回監測結果,看是繼續執行,或是退出交回到java 解决方案二: 这个可以当启动linux脚本时写一个标识位到一个文件内.当其它用户再启动linux脚本时检测这个文件.是否存在即可. 解决方案三

c++-C++多次操作数据库,打开数据库的操作只想执行一次应该放在什么位置

问题描述 C++多次操作数据库,打开数据库的操作只想执行一次应该放在什么位置 小型学生管理系统,有一个类Database专门用于操作数据库,构造函数里有打开数据库的操作,增删改查操作四个类里都建了Database类对象,程序运行时数据库会打开多次,请问打开数据库的操作只想执行一次的话,应该放在什么位置 解决方案 在c++ builder里一般open是用来执行查询,查询几次就要open几次 解决方案二: 其实你走了弯路, 这个不是需要你思考的东西. 数据库连接的打开, 固然需要时间, 但你不关闭