Как я могу получить доступ и попробовать анализировать данные буфера обмена из других приложений, таких как MS Word или Visual Studio? - PullRequest
0 голосов
/ 08 марта 2011

Я понимаю, что разработчики сторонних приложений не обязательно хотят, чтобы я получал доступ к их данным в буфере обмена, в лучшем случае, к текстовой сводке, подобной той, которую я получаю при вставке из Word в Блокнот.Тем не менее, предположим, что я хочу взять содержимое буфера обмена и попытаться извлечь что-то полезное для себя.Как мне это сделать?Влечет ли это замешательство в памяти других процессов?Или пытаться обнаружить и извлечь свойства из объекта буфера обмена, используя Reflection в dotnet?Или как бы вы подошли к этому?

ETA: хорошо, для менее абстрактно мыслящих рассмотрим пример: в конструкторе форм Visual Studio я выбираю несколько виджетов и копирую.Теперь я хотел бы проанализировать буфер обмена, чтобы найти имена, местоположения и размеры только что скопированных виджетов (я не хочу писать плагины для Visual Studio и т. Д., Я хочу специально получать информацию из буфера обмена).Я знаю, что это теоретически возможно просто потому, что можно копировать и вставлять виджеты (включая их имена, местоположения и другие свойства) между двумя экземплярами процесса Visual Studio.

1 Ответ

2 голосов
/ 08 марта 2011

Ну, вы можете просто прочитать данные прямо из System.Windows.Clipboard. Это так просто!

Возможно, вам придется работать с некоторыми из более эзотерических форматов данных, но как только данные окажутся в буфере обмена, вы сможете их прочитать. Для Word вы можете обнаружить, что формат HTML, который он помещает в буфер обмена, вполне соответствует вашим потребностям.

Здесь нет проблем безопасности или конфиденциальности, потому что пользователь дал согласие на запуск вашей программы. Было бы неправильно разрешать вам читать буфер обмена другого зарегистрированного пользователя, но вы не можете этого сделать.


Вы обновили вопрос и теперь задаете что-то более конкретное. Поэтому я скопировал некоторые виджеты в буфер обмена, а затем воспользовался средством просмотра буфера обмена, чтобы увидеть, какие там форматы. Тот, который выскочил, был CF_DESIGNERCOMPONENTS_V2. Быстрый поиск по сайту привел меня на этот сайт:

http://www.windowsdevelop.com/windows-forms-designer/for-designer-copycutpaste-what-type-data-format-does-ms-set-the-clipboard-dataobject-to-8507.shtml

Там есть некоторый код, по-видимому, от Reflector, который показывает, как дизайнер обрабатывает команду Копировать:

protected void OnMenuCopy(object sender, EventArgs e)
{
      if (this.SelectionService != null)
      {
            Cursor cursor1 = Cursor.Current;
            try
            {
                  Cursor.Current = Cursors.WaitCursor;
                  ICollection collection1 = this.GetCopySelection();
                  collection1 = this.PrependComponentNames(collection1);
                  IDesignerSerializationService service1 = (IDesignerSerializationService) this.GetService(typeof(IDesignerSerializationService));
                  if (service1 != null)
                  {
                        object obj1 = service1.Serialize(collection1);
                        MemoryStream stream1 = new MemoryStream();
                        new BinaryFormatter().Serialize(stream1, obj1);
                        stream1.Seek((long) 0, SeekOrigin.Begin);
                        byte[] buffer1 = stream1.GetBuffer();
                        IDataObject obj2 = new DataObject("CF_DESIGNERCOMPONENTS_V2", buffer1);
                        Clipboard.SetDataObject(obj2);
                  }
                  this.UpdateClipboardItems(null, null);
            }
            finally
            {
                  Cursor.Current = cursor1;
            }
      }
}

Это должно помочь вам начать!

...