2

是否可以使用 Clipboard 类从剪贴板中获取所有数据,例如完整的 Skype 引号?他们使用某种我认为的元数据,这就是它如何知道某物何时是引用的。

如何从剪贴板类访问它?我会调用哪些函数来设置/恢复 Skype 报价?

谢谢您的帮助!

Imports System.IO
Imports System.Text

Public Class Form1
    Dim locale As New MemoryStream()
    Private Sub l() Handles MyBase.Load

        Dim strr As New StreamReader(CType(Clipboard.GetData("SkypeMessageFragment"), System.IO.Stream))
        locale = Clipboard.GetData("locale")
        TextBox1.Text = strr.ReadToEnd()
        For Each x In Clipboard.GetDataObject().GetFormats()
            'MessageBox.Show("Format " + x + ": " + Clipboard.GetData(x).ToString)
        Next
    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        Clipboard.Clear()
        Clipboard.SetData("SkypeMessageFragment", StreamFromString(TextBox1.Text))
        Clipboard.SetData("Text", "testing")
        Clipboard.SetData("System.String", "testing")
        Clipboard.SetData("UnicodeText", "testing")
        Clipboard.SetData("OEMText", "testing")
        Clipboard.SetData("locale", locale)
    End Sub
    Private Shared Function StreamFromString(ByVal s As String) As Stream
        Dim encoding As New System.Text.UnicodeEncoding()
        Dim mem As New MemoryStream(encoding.GetBytes(s))
        Return mem
    End Function


End Class
4

2 回答 2

3

我知道这个已经很老了,但我找到了可以让你走上正轨的代码:


首先,您检索剪贴板:

var dataObj = Clipboard.GetDataObject();
var formats = dataObj.GetFormats();

然后你检索它的数据:

var sysString = dataObj.GetData("System.String");
var unicode = dataObj.GetData("UnicodeText");
var text = dataObj.GetData("Text");
var oemText = dataObj.GetData("OEMText");
var msgFragment = dataObj.GetData("SkypeMessageFragment") as MemoryStream;
var msg = new StreamReader(msgFragment).ReadToEnd();

然后创建一个新的 DataObject 来保存报价并将其设置到剪贴板:

DataObject dataObj = new DataObject();
DateTime time = DateTime.UtcNow;

string msg = "This is a Konloch message";
string msgInText = string.Format("[{0}] {1}: {2}", time.ToString("0:hh:mm:ss"), "konloch.me", msg);
string msgInXml = string.Format("<quote author=\"{0}\" timestamp=\"{1}\">{2}</quote>", "konloch.me", time, msg);

dataObj.SetData("System.String", msgInText);
dataObj.SetData("UnicodeText", msgInText);
dataObj.SetData("Text", msgInText);
dataObj.SetData("OEMText", msgInText);
dataObj.SetData("SkypeMessageFragment", new MemoryStream(Encoding.UTF8.GetBytes(msgInXml)));
Clipboard.SetDataObject(dataObj, true);

给原作者点赞:http: //pastebin.com/RygFN7xQ

干杯!

于 2013-09-12T09:13:32.513 回答
2

如果您不知道格式,那么您将不得不进行实验。首先迭代和显示可用格式,使用 Clipboard.GetDataObject().GetFormats()。这些是字符串,你可能会认出一些东西。您可以将其中一个传递给 Clipboard.GetData(),您将得到一个不透明的对象。把它放在一个监视表达式中,也许调试器可以理解它。

如果 Skype 将剪贴板用于自己的用途,那么您几乎没有希望挖掘出任何可用的东西。如果它打算为 MS Word 等常用应用程序提供剪贴板数据,而不需要某种插件,那将有很大的希望。

于 2010-04-30T00:01:06.900 回答