我将尽力详细解释我要实现的目标。

我将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/

    10-13 08:45