我的剪贴板填充了文本,但是当我运行时
string clipboardData = Clipboard.GetText(System.Windows.Forms.TextDataFormat.Text);
我找回一个空字符串.我玩过各种形式的电话,包括:
string clipboardData = Clipboard.GetText(); string clipboardData = Clipboard.GetText(System.Windows.Forms.TextDataFormat.UnicodeText);
但结果相同.
我错过了一些明显的东西吗
您只能从STA线程访问剪贴板.Rick Brewster在Paint.NET中对常规的Edit-> Paste命令进行了一些重构.
码:
IDataObject idat = null; Exception threadEx = null; Thread staThread = new Thread( delegate () { try { idat = Clipboard.GetDataObject(); } catch (Exception ex) { threadEx = ex; } }); staThread.SetApartmentState(ApartmentState.STA); staThread.Start(); staThread.Join(); // at this point either you have clipboard data or an exception
代码来自里克.http://forums.getpaint.net/index.php?/topic/13712-/page__view__findpost__p__226140
更新:Jason Heine()
在delegate
修复模糊方法错误之后提出了一个很好的补充点.
老实说,我不知道STA线程是什么,但在简单的项目中,它可以解决[STAThread]
在Main
方法之前添加的问题:
[STAThread] static void Main(string[] args) { (...)
它对我有用,所以我不会质疑这个方法;)
关于[STAThread]
装饰器的更多信息在博客文章中为什么需要STAThread?.
我已经编写了这个类,它可以工作,并且做同样的事情,只需添加你需要的方法就可以轻松改进
Private Class ClipboardAsync Private _GetText As String Private Sub _thGetText(ByVal format As Object) Try If format Is Nothing Then _GetText = Clipboard.GetText() Else _GetText = Clipboard.GetText(DirectCast(format, TextDataFormat)) End If Catch ex As Exception _GetText = String.Empty End Try End Sub Public Function GetText() As String Dim instance As New ClipboardAsync Dim staThread As New Thread(AddressOf instance._thGetText) staThread.SetApartmentState(ApartmentState.STA) staThread.Start() staThread.Join() Return instance._GetText End Function Public Function GetText(ByVal format As TextDataFormat) As String Dim instance As New ClipboardAsync Dim staThread As New Thread(AddressOf instance._thGetText) staThread.SetApartmentState(ApartmentState.STA) staThread.Start(format) staThread.Join() Return instance._GetText End Function Private _ContainsText As Boolean Private Sub _thContainsText(ByVal format As Object) Try If format Is Nothing Then _ContainsText = Clipboard.ContainsText() Else _ContainsText = Clipboard.ContainsText(DirectCast(format, TextDataFormat)) End If Catch ex As Exception _ContainsText = False End Try End Sub Public Function ContainsText() As Boolean Dim instance As New ClipboardAsync Dim staThread As New Thread(AddressOf instance._thContainsFileDropList) staThread.SetApartmentState(ApartmentState.STA) staThread.Start() staThread.Join() Return instance._ContainsText End Function Public Function ContainsText(ByVal format As Object) As Boolean Dim instance As New ClipboardAsync Dim staThread As New Thread(AddressOf instance._thContainsFileDropList) staThread.SetApartmentState(ApartmentState.STA) staThread.Start(format) staThread.Join() Return instance._ContainsText End Function Private _ContainsFileDropList As Boolean Private Sub _thContainsFileDropList(ByVal format As Object) Try _ContainsFileDropList = Clipboard.ContainsFileDropList Catch ex As Exception _ContainsFileDropList = False End Try End Sub Public Function ContainsFileDropList() As Boolean Dim instance As New ClipboardAsync Dim staThread As New Thread(AddressOf instance._thContainsFileDropList) staThread.SetApartmentState(ApartmentState.STA) staThread.Start() staThread.Join() Return instance._ContainsFileDropList End Function Private _GetFileDropList As Specialized.StringCollection Private Sub _thGetFileDropList() Try _GetFileDropList = Clipboard.GetFileDropList Catch ex As Exception _GetFileDropList = Nothing End Try End Sub Public Function GetFileDropList() As Specialized.StringCollection Dim instance As New ClipboardAsync Dim staThread As New Thread(AddressOf instance._thGetFileDropList) staThread.SetApartmentState(ApartmentState.STA) staThread.Start() staThread.Join() Return instance._GetFileDropList End Function End Class
这是CSharp版本:
private class ClipboardAsync { private string _GetText; private void _thGetText(object format) { try { if (format == null) { _GetText = Clipboard.GetText(); } else { _GetText = Clipboard.GetText((TextDataFormat)format); } } catch (Exception ex) { //Throw ex _GetText = string.Empty; } } public string GetText() { ClipboardAsync instance = new ClipboardAsync(); Thread staThread = new Thread(instance._thGetText); staThread.SetApartmentState(ApartmentState.STA); staThread.Start(); staThread.Join(); return instance._GetText; } public string GetText(TextDataFormat format) { ClipboardAsync instance = new ClipboardAsync(); Thread staThread = new Thread(instance._thGetText); staThread.SetApartmentState(ApartmentState.STA); staThread.Start(format); staThread.Join(); return instance._GetText; } private bool _ContainsText; private void _thContainsText(object format) { try { if (format == null) { _ContainsText = Clipboard.ContainsText(); } else { _ContainsText = Clipboard.ContainsText((TextDataFormat)format); } } catch (Exception ex) { //Throw ex _ContainsText = false; } } public bool ContainsText() { ClipboardAsync instance = new ClipboardAsync(); Thread staThread = new Thread(instance._thContainsFileDropList); staThread.SetApartmentState(ApartmentState.STA); staThread.Start(); staThread.Join(); return instance._ContainsText; } public bool ContainsText(object format) { ClipboardAsync instance = new ClipboardAsync(); Thread staThread = new Thread(instance._thContainsFileDropList); staThread.SetApartmentState(ApartmentState.STA); staThread.Start(format); staThread.Join(); return instance._ContainsText; } private bool _ContainsFileDropList; private void _thContainsFileDropList(object format) { try { _ContainsFileDropList = Clipboard.ContainsFileDropList; } catch (Exception ex) { //Throw ex _ContainsFileDropList = false; } } public bool ContainsFileDropList() { ClipboardAsync instance = new ClipboardAsync(); Thread staThread = new Thread(instance._thContainsFileDropList); staThread.SetApartmentState(ApartmentState.STA); staThread.Start(); staThread.Join(); return instance._ContainsFileDropList; } private Specialized.StringCollection _GetFileDropList; private void _thGetFileDropList() { try { _GetFileDropList = Clipboard.GetFileDropList; } catch (Exception ex) { //Throw ex _GetFileDropList = null; } } public Specialized.StringCollection GetFileDropList() { ClipboardAsync instance = new ClipboardAsync(); Thread staThread = new Thread(instance._thGetFileDropList); staThread.SetApartmentState(ApartmentState.STA); staThread.Start(); staThread.Join(); return instance._GetFileDropList; } }
你可以简单地使用它:Vb.net:
Dim Clipboard2 As New ClipboardAsync MessageBox.Show (Clipboard2.ContainsText())
CSHARP:
ClipboardAsync Clipboard2 = new ClipboardAsync(); MessageBox.Show (Clipboard2.ContainsText());
BoltBait的代码不适用于IDataObject,因为数据对象丢失了线程外的信息.一切正常,如果IDataObject只在线程内使用,如下所示:
IDataObject idat = null; Exception threadEx = null; String text = ""; Thread staThread = new Thread( delegate () { try { idat = Clipboard.GetDataObject(); text = idat.GetData(DataFormats.Text) } catch (Exception ex) { threadEx = ex; } }); staThread.SetApartmentState(ApartmentState.STA); staThread.Start(); staThread.Join(); // here you can use text, which contains data from clipboard