我会尽我最大的努力详细解释我想要实现的目标。我正在使用C#和IntPtr窗口句柄从我的C#应用程序中对外部应用程序执行CTRL-C复制操作。我必须这样做,因为没有办法使用GET_TEXT直接访问文本内容。然后,我在我的应用程序中使用该复制的文本内容。问题在于我现在已经覆盖了剪贴板。
我想要能够做到以下几点:
1.备份剪贴板中的原始内容,这些内容可能是由除我的应用程序之外的任何应用程序设置的。 2.然后执行复制并将值存储到我的应用程序中。 3.然后恢复剪贴板的原始内容,以便用户仍然可以访问其原始剪贴板数据。
这是我迄今为止尝试过的代码:
我想要能够做到以下几点:
1.备份剪贴板中的原始内容,这些内容可能是由除我的应用程序之外的任何应用程序设置的。 2.然后执行复制并将值存储到我的应用程序中。 3.然后恢复剪贴板的原始内容,以便用户仍然可以访问其原始剪贴板数据。
这是我迄今为止尝试过的代码:
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,所以这是一个挑战。我不确定在这里传递什么。也许有人可以解释一下?
我是否错误地使用了Clipboard类?有没有清晰的方法获取没有GUI的应用程序的IntPtr窗口句柄?有谁知道更好的备份和还原系统剪贴板的方法吗?