剪贴板无法使用setdataobject恢复数据

时间:2012-04-07 17:44:13

标签: c# wpf clipboard

我遇到了恢复数据的问题,这里是代码,如果你阅读了评论,那么我认为你会理解这个问题,并希望知道如何解决这个问题。

var oldclip = System.Windows.Clipboard.GetDataObject(); //Here we save the clipboard
var oldpoint = CursorPosition;
CursorPosition = new System.Drawing.Point((Convert.ToInt32((rect.Width - rect.X) * 0.45) + rect.X), Convert.ToInt32((rect.Height - rect.Y) * 0.75) + rect.Y);
DoLeftMouseClick();
SetForegroundWindow(hwnd);
System.Threading.Thread.Sleep(20);
System.Windows.Forms.SendKeys.SendWait("^a^c{ESCAPE}"); // here we go select all text and then copy it to the clipboard
if (System.Windows.Clipboard.GetDataObject().GetDataPresent(DataFormats.Text)) //if the clipboard has text then we do something with it to get that info in the blabla here
{
    //...blabla //
}
System.Windows.Clipboard.SetDataObject(oldclip); // HERE I want to restore the clipboard but that fails! After this when I CTRL+P(paste) then it returns nothing,(while it should still have the same "oldclip" data no??
编辑:我更了解如何解释我的问题。让我们说我有2个按钮,按钮保存&按钮恢复。 我们得到了一个变量:

 IDataObject oldclip;

按钮保存代码为:

oldclip = System.Windows.Clipboard.GetDataObject();

我们收到了恢复按钮代码

System.Windows.Clipboard.SetDataObject(oldclip);

现在我复制一些文字“randomtext123”。我按下保存按钮。然后我去复制一些其他文本“otherrandomtext”。 现在,如果我按下恢复按钮,我希望剪贴板数据再次成为“randomtext123”,但这不会发生。(因为如果我在resto按钮之后粘贴它没有做任何事情,就像剪贴板上没有任何东西一样)。希望你现在更好地理解这个问题:)

2 个答案:

答案 0 :(得分:3)

这应该产生预期的结果:

public class ClipboardBackup
{
    Dictionary<string, object> contents = new Dictionary<string,object>();

    public void Backup()
    {
        contents.Clear();
        IDataObject o = Clipboard.GetDataObject();
        foreach (string format in o.GetFormats())
            contents.Add(format, o.GetData(format));
    }

    public void Restore()
    {
        DataObject o = new DataObject();

        foreach (string format in contents.Keys)
        {
            o.SetData(format, contents[format]);
        }

        Clipboard.SetDataObject(o);
    }
}

P.S。你可能不想这样做。请参阅此答案:https://stackoverflow.com/a/2579846/305865

答案 1 :(得分:0)

根据MSDN documentation,如果要使用系统剪贴板,则必须将权限设置为AllClipboard:

  

有权访问系统剪贴板上的数据。关联的   枚举:AllClipboard

我刚测试过,在代码库中运行此代码可以解决问题:

    UIPermission clipBoard = new UIPermission(PermissionState.None);
    clipBoard.Clipboard = UIPermissionClipboard.AllClipboard;