【发布时间】:2012-12-10 21:58:57
【问题描述】:
神秘的剪贴板问题:
我有一个正在开发的应用程序,它启动一个外部应用程序(作为 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));
}
数据对象始终为空,即使剪贴板中有文本并且我可以将其粘贴到其他应用程序中。
谁能指出客户端应用程序代码中的缺陷?为什么'data'总是为空,即使剪贴板上有数据?
【问题讨论】:
-
我已经尝试运行您的代码,它运行良好并且可以在剪贴板上获取任何文本。但是,将数据复制到剪贴板的应用程序可能会决定在退出时清除剪贴板,但我认为这不是问题的根源,因为您可以将文本粘贴到记事本中。
-
我目前使用的复制应用程序是一个非常简单的 Windows 窗体测试应用程序,它只执行 Clipboard.SetText(tbTextBox.text) 操作。它不会在任何地方明确清除剪贴板,正如您指出的那样,我可以在测试应用程序关闭后粘贴到记事本中,但我的客户端应用程序检索到一个空字符串!
-
改用 DataFormats.UnicodeText。使用方便的方法,Clipboard.SetText() 和 GetText(),陷入成功的陷阱。
-
这是空的数据对象 - 里面没有任何东西可以应用 DataFormats.UnicodeText。