.net剪贴板元数据(或任何skype引用使用)

时间:2010-04-29 23:37:52

标签: .net vb.net skype

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

如何从Clipboard类访问它?我可以调用什么功能来设置/恢复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

2 个答案:

答案 0 :(得分: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

干杯!

答案 1 :(得分:2)

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

如果Skype使用剪贴板供自己使用,那么你几乎没有希望可以挖出任何可用的东西。如果它打算向常见的应用程序(如MS Word)提供剪贴板数据,而没有某种加载项,那么会有很多希望。