метаданные буфера обмена .net (или любые другие цитаты в скайпе) - PullRequest
2 голосов
/ 30 апреля 2010

Можно ли использовать класс 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 ]

3 голосов
/ 12 сентября 2013

Я знаю, что этот файл очень старый, но я нашел код, который поможет вам выбрать правильный путь:


Сначала вы получаете буфер обмена:

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

Ура!

2 голосов
/ 30 апреля 2010

Если вы не знаете формат, вам придется экспериментировать. Начните с итерации и отображения доступных форматов, используйте Clipboard.GetDataObject (). GetFormats (). Это строки, вы можете узнать что-то. Вы можете передать один из них в Clipboard.GetData (), вы получите непрозрачный объект обратно. Поместите это в выражение для часов, возможно, отладчик сможет это понять.

Если Skype использует буфер обмена для собственного использования, вряд ли можно найти что-нибудь полезное. Если он намеревается предоставить данные буфера обмена для обычных приложений, таких как MS Word, без какой-либо надстройки, у вас будет много надежд.

...