相关疑难解决方法(0)

如何在C#中备份和恢复系统剪贴板?

我将尽我所能详细解释我正在努力实现的目标.

我正在使用带有IntPtr窗口句柄的C#来从我自己的C#应用​​程序对外部应用程序执行CTRL-C复制操作.我不得不这样做,因为无法使用GET_TEXT直接访问文本.然后我在我的应用程序中使用该副本的文本内容.这里的问题是我现在已经覆盖了剪贴板.

我希望能做的是:

  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
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用System.Windows.Clipboard而不是System.Windows.Forms.Clipboard.原因是当我执行CTRL-C时,System.Windows.Forms中的Clipboard类没有返回任何数据,但系统剪贴板却没有.

我查看了一些低级user32调用,如OpenClipboard,EmptyClipboard和CloseClipboard,希望它们可以帮助我这样做,但到目前为止,我一直在尝试恢复时遇到COM异常.

我想也许这与OpenClipboard参数有关,该参数期望一个想要控制剪贴板的应用程序的IntPtr窗口句柄.由于我提到我的应用程序没有GUI,这是一个挑战.我不知道该在这里传递什么.也许有人可以对此有所了解?

我是否错误地使用了Clipboard类?有没有明确的方法来获取没有GUI的应用程序的IntPtr窗口句柄?有谁知道备份和恢复系统剪贴板的更好方法?

c# backup clipboard restore

14
推荐指数
2
解决办法
6193
查看次数

标签 统计

backup ×1

c# ×1

clipboard ×1

restore ×1