奇诡与剪贴板访问(Strangeness with clipboard access)

2019-08-03 15:11发布

我试图写一个小的应用程序,需要使用剪贴板的一些功能。 因为我不希望目前覆盖剪贴板中的用户数据,我决定将它保存到内存中,做好我的工作,然后将它写回。 下面的代码是一个控制台应用程序是什么,我试图做一个准系统的例子。

我遇到的问题是恢复状态。 如果我复制的东西从Visual Studio剪贴板中运行应用程序之前共有剪贴板(各种字符串格式和语言环境)六个对象,所有获得放入缓存都是。 一旦我恢复他们虽然只有语言环境中的剪贴板,它似乎每次调用的SetData()将覆盖上。 (顺便说一下SetDataObject似乎并没有成为GetDataObject的倒数,所以我不能只是使用)

任何想法如何,我可以存储剪贴板状态,后来恢复了吗?

    [STAThread]
    static void Main(string[] args)
    {
        //Store the old clipboard data
        Dictionary<string, object> clipboardCache = new Dictionary<string, object>();

        IDataObject clipboardData = Clipboard.GetDataObject();

        foreach (string format in clipboardData.GetFormats())
        {
            clipboardCache.Add(format, clipboardData.GetData(format));
        }

        Clipboard.SetText("Hello world!");

        string value = Clipboard.GetText();

        Console.WriteLine(value);

        //Clear the clipboard again and restore old data
        Clipboard.Clear();

        foreach (KeyValuePair<string, object> valuePair in clipboardCache)
        {
            Clipboard.SetData(valuePair.Key, valuePair.Value);
            Thread.Sleep(100);
        }

        Console.ReadLine();
    }

Answer 1:

Windows剪贴板只有在某一时刻它一个对象。 但也有多种格式(如RTF,文本,HTML)从一个对象。 我认为你是使它太复杂,你的代码应该是这样的:

//Store the old clipboard data
IDataObject clipboardData = Clipboard.GetDataObject();

Clipboard.SetText("Hello world!");

string value = Clipboard.GetText();
Console.WriteLine(value);

//Clear the clipboard again and restore old data
Clipboard.Clear();
Clipboard.SetDataObject(clipboardData);

Console.ReadLine();


Answer 2:

马丁,我已经试过你的代码。 我有ClipX安装在我的系统上。 随着当我运行你的代码运行它,我得到的ClipX的缓存尽可能多的项目存在。 但电话Clipboard.GetDataObject()只返回最新的对象。 那么,什么情况是,当你调用这个循环:

foreach (string format in clipboardData.GetFormats())
{
    clipboardCache.Add(format, clipboardData.GetData(format));
}

它返回在ClipX所有对象的格式,并且转换返回的数据

IDataObject clipboardData = Clipboard.GetDataObject();

所以,实际上,当你执行这个循环

foreach (KeyValuePair<string, object> valuePair in clipboardCache)
{
    Clipboard.SetData(valuePair.Key, valuePair.Value);
    Thread.Sleep(100);
}

你有被设置为剪贴板只有一个对象。

其次使用时Clipboard.SetData(format,object)改写成新的旧的对象是正常的行为不正常的一个。 如果您正在构建的多次入境剪贴板诸如此类的事情,那么你需要拦截的复制和粘贴系统调用,并保持在你的程序的内存或磁盘的对象。 你可以不依赖于默认剪贴板。



文章来源: Strangeness with clipboard access
标签: c# clipboard