2 vencon s vencon_s 于 2015.06.02 00:43 提问

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数据不会改变。请问该如何实现

3个回答

lzp_lrp
lzp_lrp   Ds   Rxr 2015.06.02 09:10
已采纳

在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();
}
vencon_s
vencon_s 我想我已经解决问题了。剪贴板的最大问题是系统会在占用剪贴板后洗白剪贴板内存。导致IdataObject引用地址数据改变。现在我学习你给例子的思路。使用winapi操作剪贴板,复制数据最后恢复。我想已经解决问题了。
2 年多之前 回复
vencon_s
vencon_s C#的clipboard没有format属性或方法,此路不通也。
2 年多之前 回复
vencon_s
vencon_s 不行,c#的clipboard类没有formart
2 年多之前 回复
vencon_s
vencon_s C# 对指针操作不知道有这么好用不。c++我不大会,努力看了下。大意是创建一个剪贴板数据指针列表。读取后锁定数据,最后保存。我尝试去改下。还是继续希望找到C#中的其他方法。谢谢
2 年多之前 回复
caozhy
caozhy   Ds   Rxr 2015.06.02 02:30

Clipboard.GetDataObject
Clipboard.SetDataObject

vencon_s
vencon_s 不行的,我试过才来发帖的。今天白天停电,一直没法上线看回复
2 年多之前 回复
lzp_lrp
lzp_lrp   Ds   Rxr 2015.06.02 08:25

IDataObject iData = Clipboard.GetDataObject();

//对剪切板进行处理

Clipboard.SetDataObject(iData)

vencon_s
vencon_s 回复PB人生: 已解决啦。思路是你给的C++代码的思路
2 年多之前 回复
lzp_lrp
lzp_lrp 回复vencon_s: 或者考虑用c或c++写个dll之类的,用指针比较好实现
2 年多之前 回复
lzp_lrp
lzp_lrp 回复vencon_s: 是的,昨天测试过了,这个方法不通
2 年多之前 回复
vencon_s
vencon_s 我看了下你给的代码,IDataObject iData = Clipboard.GetDataObject(); //对剪切板进行处理 Clipboard.SetDataObject(iData)不能得到正确结果的原因找到了。iData只是对clipboard的一个引用。clipboard操作后会对clipboard内的内容清空,结果iData数据的格式idata.getformat()没有任何改变。而数据实际变了,导致不能得到想到的结果
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片