2

神秘的剪贴板问题:

我有一个正在开发的应用程序,它启动一个外部应用程序(作为 System.Diagnostics.Process 对象),该应用程序预计会将一些数据(文本)复制到剪贴板。当外部应用程序关闭时,客户端应用程序从剪贴板中检索文本。

问题是,尽管一旦外部应用程序将文本复制到剪贴板,我就可以将其粘贴到记事本中,但客户端应用程序会从剪贴板获取空字符串。

外部应用代码:

    private void btn1_Click(object sender, EventArgs e)
    {
        //copy text pane to clipboard
        DataObject obj = new DataObject();
        obj.SetData(tbText.Text);
        System.Windows.Forms.Clipboard.SetDataObject(obj);
    }

客户端应用代码:

        string returnedValues = string.Empty;

        System.Windows.Forms.IDataObject data = System.Windows.Forms.Clipboard.GetDataObject();
        if (data != null && data.GetDataPresent(System.Windows.Forms.DataFormats.Text) == true)
        {
            returnedValues = (string) data.GetData(System.Windows.Forms.DataFormats.Text, true));
        }

数据对象始终为空,即使剪贴板中有文本并且我可以将其粘贴到其他应用程序中。

任何人都可以指出客户端应用程序代码中的缺陷吗?为什么即使剪贴板上有数据,“数据”总是为空?

4

2 回答 2

1

当剪贴板中的所有内容都是复制为文本的字符串时,您必须将其检索为

Clipboard.GetText()

并检索其他类型的对象,您可以使用 GetData()

于 2012-12-10T13:45:47.440 回答
0

对于文本,你真的应该使用SetText()and GetText()。并确保覆盖剪贴板的当前内容是用户在您的场景中所期望的。如果不是,您应该改用进程间通信,参见例如What is the simple method of inter-process communication between 2 C# processes?

于 2012-12-10T13:58:57.337 回答