Можно использовать class
метод для получения класса любого объекта в рубине.
, например,
array= []
=> []
array.class
=> Array
hash = {}
=> {}
hash.class
=> Hash
string = 'This is String'
=> "This is String"
string.class
=> String
В буфере обмена Windows есть только один объект в время. Но есть несколько доступных форматов (например, RTF, Text, HTML) из этого одного объекта. Я думаю, что вы делаете это слишком сложным, и ваш код должен быть примерно таким:
//Store the old clipboard data
IDataObject clipboardData = Clipboard.GetDataObject();
Clipboard.SetText("Hello world!");
string value = Clipboard.GetText();
Console.WriteLine(value);
//Clear the clipboard again and restore old data
Clipboard.Clear();
Clipboard.SetDataObject(clipboardData);
Console.ReadLine();
Мартин Я пробовал ваш код. В моей системе установлен ClipX . Когда он работает, когда я запускаю ваш код, я получаю столько элементов, сколько их в кеше ClipX. Но вызов Clipboard.GetDataObject ()
возвращает только последний объект. Итак, что происходит, когда вы вызываете этот цикл:
foreach (string format in clipboardData.GetFormats())
{
clipboardCache.Add(format, clipboardData.GetData(format));
}
, он возвращает формат для всего объекта в ClipX и конвертирует данные, возвращенные
IDataObject clipboardData = Clipboard.GetDataObject();
. Так что на самом деле, когда вы выполняете этот цикл
foreach (KeyValuePair<string, object> valuePair in clipboardCache)
{
Clipboard.SetData(valuePair.Key, valuePair.Value);
Thread.Sleep(100);
}
, у вас есть только один объект который устанавливается в буфер обмена.
Во-вторых, при использовании Clipboard.SetData (format, object)
перезапись старого объекта новым является нормальным поведением, а не нормальным. Если вы создаете что-то вроде буфера обмена с несколькими записями, вам необходимо перехватывать системные вызовы копирования и вставки и сохранять объект в памяти или на диске вашей программы. Вы не можете полагаться на буфер обмена по умолчанию.