Vb.net 请求的剪贴板操作失败

Vb.net 请求的剪贴板操作失败,vb.net,clipboard,Vb.net,Clipboard,我一直在使用vb.NET2003,有时会出现这种错误。有人知道这个错误是如何产生的,以及如何修复它吗 错误:请求的剪贴板操作失败我用谷歌搜索了这个问题以查看我看到了什么,很多人都问了这个问题,但没有人得到可靠的答案 所以我查阅了MSDN文档,发现了一个注释,解释了大多数提出这个问题的人所描述的内容。。。该症状通常在代码运行时用户切换到另一个应用程序时出现。下面引用了注释,并链接到以下文档: 所有基于Windows的应用程序共享 系统剪贴板,因此 在您切换时可能会发生更改 到另一个应用程序 对象必

我一直在使用vb.NET2003,有时会出现这种错误。有人知道这个错误是如何产生的,以及如何修复它吗


错误:请求的剪贴板操作失败

我用谷歌搜索了这个问题以查看我看到了什么,很多人都问了这个问题,但没有人得到可靠的答案

所以我查阅了MSDN文档,发现了一个注释,解释了大多数提出这个问题的人所描述的内容。。。该症状通常在代码运行时用户切换到另一个应用程序时出现。下面引用了注释,并链接到以下文档:

所有基于Windows的应用程序共享 系统剪贴板,因此 在您切换时可能会发生更改 到另一个应用程序

对象必须是可序列化的 要放在剪贴板上。如果你 将不可序列化的对象传递给 剪贴板方法,该方法将失败 没有抛出异常。看见 有关详细信息,请参阅System.Runtime.Serialization 有关序列化的信息。如果你的 目标应用程序需要一个 特定的数据格式,标题 添加到序列化中的数据 进程可能会阻止应用程序 从识别你的数据。到 保留数据格式,添加 将数据作为字节数组发送到MemoryStream 并将MemoryStream传递给 SetData方法

剪贴板类只能使用 在线程中设置为单线程 公寓(STA)模式。用这个 类,确保您的主方法是 用statThreadAttribute标记 属性

可能需要特别考虑 在使用图元文件时需要 使用剪贴板格式化。由于 当前的限制 数据对象的实现 类使用的图元文件格式 可能无法识别.NET Framework 由使用旧版本的 图元文件格式。在这种情况下,你 必须与Win32进行互操作 剪贴板应用程序编程 接口(API)。更多 信息,见第323530条, “剪贴板上的图元文件不可用 对所有应用程序可见”,在 Microsoft知识库位于

有趣的是,我在自己的一个应用程序中注意到了一个奇怪的行为,这就说明了这一点。我有一个应用程序可以写入Excel电子表格(实际上,可以写入数百个电子表格,每个表格修改数百个单元格)。我根本不使用剪贴板,只是excel的Interop API,但是当它运行时,每次创建新的电子表格时,我的剪贴板都会清除。在我的例子中,Excel正在弄乱剪贴板,即使它没有明显的理由这样做。我认为这是一种我们人类永远无法理解的神秘窗户现象


无论如何,多亏了你的问题,我想我理解了我的问题,因此+1感谢你帮助我。

UltraVNC是否有可能运行。当应用程序在客户端PC的后台运行时,我遇到问题。当我关闭VNC时,我可以成功地复制到剪贴板。这不是一个令人满意的解决方案,但至少我知道问题的根源。

我在尝试以下操作时出现了错误:

Clipboard.Clear();
...
Clipboard.SetText(...);
为了解决这个问题,我用pinvoking替换了
Clipboard.Clear()
,从
user32.dll
中选择了一些方法:

[DllImport("user32.dll")]
static extern IntPtr GetOpenClipboardWindow();

[DllImport("user32.dll")]
private static extern bool OpenClipboard(IntPtr hWndNewOwner);

[DllImport("user32.dll")]
static extern bool EmptyClipboard();

[DllImport("user32.dll", SetLastError=true)]
static extern bool CloseClipboard();

...

IntPtr handleWnd = GetOpenClipboardWindow();
OpenClipboard(handleWnd);
EmptyClipboard();
CloseClipboard();

...

Clipboard.SetText(...);

我在这里使用C#,但是可以很容易地从中创建vb版本。

您使用的是什么代码?如果有更多的细节,这将是一个更好的问题……您想做什么剪贴板操作?您是否在复制、粘贴、清除、监视等。?用户发起的还是自动的?帮我,帮你。改进你的问题,我会投票表决,并尝试帮助你。试试我在这个页面上发布的解决方案,谢谢!这对我起了作用。我使用的是剪贴板.GetText,得到了相同的错误。我调用了您的行以清除剪贴板,然后使用
SendKeys.Send()
发出了Ctrl+C,并且可以调用
clipboard.GetText
,没有任何错误。完美的