我将尽力详细解释我要实现的目标。
我将C#与IntPtr窗口句柄配合使用,以从我自己的C#应用程序对外部应用程序执行CTRL-C复制操作。我必须这样做,因为无法使用GET_TEXT直接访问文本。然后,我在应用程序中使用该副本的文本内容。这里的问题是我现在已经覆盖了剪贴板。
我想做的是:
这是我到目前为止尝试过的代码:
private void GetClipboardText()
{
text = "";
IDataObject backupClipboad = Clipboard.GetDataObject();
KeyboardInput input = new KeyboardInput(this);
input.Copy(dialogHandle); // Performs a CTRL-C (copy) operation
IDataObject clipboard = Clipboard.GetDataObject();
if (clipboard.GetDataPresent(DataFormats.Text))
{
// Retrieves the text from the clipboard
text = clipboard.GetData(DataFormats.Text) as string;
}
if (backupClipboad != null)
{
Clipboard.SetDataObject(backupClipboad, true); // throws exception
}
}
我正在使用System.Windows.Clipboard,而不是System.Windows.Forms.Clipboard。这样做的原因是,当我执行CTRL-C时,System.Windows.Forms中的Clipboard类没有返回任何数据,但是系统剪贴板却返回了任何数据。
我调查了一些低级的user32调用,例如OpenClipboard,EmptyClipboard和CloseClipboard,希望它们可以帮助我完成此任务,但到目前为止,在尝试还原时,我一直收到COM异常。
我以为这可能与OpenClipboard参数有关,该参数期望要控制剪贴板的应用程序的IntPtr窗口句柄。由于我提到我的应用程序没有GUI,因此这是一个挑战。我不确定在这里传递什么。也许有人可以阐明这一点?
我是否使用剪贴板类不正确?有没有一种清晰的方法来获取没有GUI的应用程序的IntPtr窗口句柄?有谁知道备份和还原系统剪贴板的更好方法?
最佳答案
尝试这样做是愚蠢的。您不能如实地将剪贴板还原到其先前的状态。使用“延迟渲染”可能会存在数十种未渲染的数据格式,并且如果您尝试全部渲染它们,则会导致源应用程序资源不足。这就像走进餐厅并说“给我一切之一”。
假设用户在Excel中选择了500行x 100列,并将其复制到剪贴板。 Excel“通告”它可以产生大约25种不同格式的数据,包括位图。将其粘贴为位图后,将强制Excel将其呈现为位图。那是50000个单元,将是大约10,000 x 15,000像素的位图。您希望用户在Excel咳嗽的同时还会等待其他24种格式吗?不可行。
此外,您将触发WM_DrawClipboard事件,这将影响其他剪贴板查看器。
放弃。
关于c# - 如何在C#中备份和还原系统剪贴板?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2578900/