Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序之间的剪贴板传输_C#_.net_Clipboard - Fatal编程技术网

C# 应用程序之间的剪贴板传输

C# 应用程序之间的剪贴板传输,c#,.net,clipboard,C#,.net,Clipboard,神秘的剪贴板问题: 我有一个正在开发的应用程序,该应用程序启动一个外部应用程序(作为System.Diagnostics.Process对象),该应用程序预期会将一些数据(文本)复制到剪贴板。当外部应用程序关闭时,客户端应用程序从剪贴板检索文本 问题是,尽管外部应用程序将文本复制到剪贴板后,我可以将其粘贴到记事本中,但客户端应用程序从剪贴板中获取一个空字符串 外部应用程序代码: private void btn1_Click(object sender, EventArgs e)

神秘的剪贴板问题:

我有一个正在开发的应用程序,该应用程序启动一个外部应用程序(作为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));
        }
客户端应用程序代码:

    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));
        }
数据对象始终为空,即使剪贴板中有文本,我可以将其粘贴到其他应用程序中


有人能告诉我客户端应用程序代码中的漏洞吗?为什么即使剪贴板上有数据,“数据”也总是空的?

当剪贴板上只有一个复制为文本的字符串时,您必须将其作为文本检索

Clipboard.GetText()

要检索其他类型的对象,可以对文本使用GetData()

,实际上应该使用
SetText()
GetText()
。并确保覆盖剪贴板的当前内容是用户在您的场景中所期望的。如果没有,您应该改用进程间通信,例如,请参阅

我已尝试运行您的代码,它工作正常,可以在剪贴板上获取任何文本。但是,将数据复制到剪贴板的应用程序可能会在退出时决定清除剪贴板,但我认为这不是问题的根源,因为您可以将文本粘贴到记事本中。我目前使用的复制应用程序是一个非常简单的Windows窗体测试应用程序,它只执行剪贴板。SetText(tbTextBox.text)操作。它不会在任何地方显式清除剪贴板,正如您所指出的,我可以在关闭测试应用程序后粘贴到记事本中,但我的客户端应用程序检索到一个空字符串!请改用DataFormats.UnicodeText。使用方便的方法clipboard.SetText()和GetText()会成功。该数据对象为空-其中没有可应用DataFormats.UnicodeText的内容。更改为SetText和GetText没有任何区别。剪贴板.GetText()返回一个空字符串,即使我可以从剪贴板粘贴到记事本。这可能是跨应用程序边界的问题吗?不,我不这么认为,剪贴板是有史以来最基本的函数之一。是否确实要将GetText的内容保存到string类型的变量而不是对象?是:string returnedValues=“”;如果(System.Windows.Forms.Clipboard.ContainsText())返回的值=System.Windows.Forms.Clipboard.GetText();我可以澄清一下吗?是DataObject对象为空,这就是为什么我无法从剪贴板中检索任何内容。问题是为什么这个对象为空?代码是:`string returnedValues=string.Empty;System.Windows.Forms.IDataObject data=System.Windows.Forms.clipboard.GetDataObject();如果(data!=null&&data.GetDataPresent(System.Windows.Forms.DataFormats.Text)==true){returnedValues=(string)data.GetData(System.Windows.Forms.DataFormats.Text,true));}`使用SetText()和GetText()没有区别-没有任何区别(尽管我仍然可以粘贴到记事本中!)