为什么这段代码不能保留剪贴板?

时间:2014-07-03 16:03:48

标签: c# clipboard

[STAThread]
static void Main(string[] args)
{
    Clipboard.SetDataObject(Clipboard.GetDataObject(), true);
}

这是关于使用DataObject剪贴板方法可以想象的最简单的测试,但如果从记事本中复制一些文本然后运行此应用程序,我将无法再在应用程序退出后粘贴该文本。没有例外。使用名为ClipView的应用程序,我可以看到文本已从剪贴板中消失。

我使用的命名空间是System.Windows.Forms中的命名空间。正如您所看到的,这是一个控制台应用程序,而不是Windows窗体应用程序,因此可能是问题背后的问题。但如果是这样,我想了解原因。

修改

为了清楚起见,这只是一个测试,我对剪贴板的实际目标更复杂。我意识到,如果我只关心文本,我可以专门用于文本。

编辑2

虽然方法文档非常需要,this Code Project articlethis MSDN article似乎都表示使用Clipboard.SetDataObject调用DataObject应该按预期工作,添加所有具有正确格式的数据对象中的数据。

2 个答案:

答案 0 :(得分:2)

根据MSDNClipboard.SetDataObject方法“清除剪贴板然后在其上放置数据并指定数据是否应在应用程序退出后保留”(强调我的)。

SetDataObject中的代码实际从Windows剪贴板中检索数据时,似乎存在幕后计时问题。如果DataObject返回的GetDataObject推迟了其读取,并且在SetDataObject返回时调用GetData之前执行了GetDataObject的清除代码,则剪贴板可能是当SetDataObject尝试设置其数据时为空。

(我的第一个想法是在调用Clipboard.GetDataObject之前发生了清算;但是,正如下面的评论者所说,任何方法调用的参数都会在该方法调用发生之前进行评估。)

答案 1 :(得分:1)

您是否检查过,如果您的应用程序运行时具有足够的权限来访问剪贴板?

尝试在剪贴板前面添加以下代码行,看看是否有安全例外:

IPermission permission = new UIPermission(PermissionState.None);
permission.Clipboard = UIPermissionClipboard.AllClipboard;
permission.Demand();

我测试了代码,对我来说它显示了相同的行为。 但是,手动备份每个ClipBoard条目并手动恢复它可以正常工作。 (按钮1存储它,按钮2恢复它)

Dictionary<string, object> d = new Dictionary<string, object>();

private void button1_Click(object sender, EventArgs e)
{
    d = new Dictionary<string, object>();
    IDataObject o = Clipboard.GetDataObject();
    foreach (string format in o.GetFormats())
    {
        d.Add(format, o.GetData(format));
    }
}

private void button2_Click(object sender, EventArgs e)
{
    DataObject o = new DataObject();

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

    Clipboard.SetDataObject(o);

}