private void button1_Click(object sender, EventArgs e)
{
pictureBox1.Image = Clipboard.GetImage();
}
Получение из клипбоарда вордовой картинки
Стандартный дотнетовский Clipboard такую ботву не видит. Clipboard.ContainsData(DataFormats.EnhancedMetafile) возвращает false, равно как и все другие форматы. Естественно, GetData и GetDataObject тоже молчат.
Микрософт говорит что-то типа того, что у дотнета какой-то свой, особенный формат клипбоарда, не совместимый в частности с вордом. Отлично, лезем в user32.dll.
Экстерн IsClipboardFormatAvailable(14) /* CF_ENHMETAFILE = 14 */ возвращает - о чудо! - true. Однако, GetClipboardData(14) - нуль-поинтер.
Наконец, обнаружился код апишника на С++, который такой метафайл из буфера читает, и даже выводит картинку на экран. Пялился на код часа два - так и не понял, в чем принципиальное отличие использования апишных методов.
Мучусь - уже замучился =)
Поможите кто чем можете...
Заранее благодарен
Открыл MS Word. Засунул туда специальной вставкой JPG фотку. Далее написал Windows Forms приложение, разместил туда PictureBox pictureBox1 и кнопульку Button pasteButton. В обработчике кнопки написал:
Код:
Далее сохраняю документа ворда (для пущей уверенности, что подвоха нет). Открываю, выделяю фотку, нажимаю Ctrl+C. Запускаю своё приложение и картинка без проблем вставляется в PictureBox. Пробовал потом и bmp, и gif засунуть, даже Windows Meta File засовывал, всё вставляет. Писал на .NET Framework 2.0. Если не веришь, могу выслать исходник и ворд-документ с картинкой.
Если никаких особенностей кода нет и присутствуют только пикчербокс и кнопка с одним событием - извините, я не настолько туп, чтоб такой код просить ;)
А вот вордовый документ интересен... Фишка в том, что у меня при копировании методом Ctrl+C в ворде в буфер попадает EnhancedMetafile. Так что GetImage возвращает null хоть убей...
Кстати.
Я сделал открытие, что клипбоард просто недоступен (читать: нулевой), если в проекте нет формы (например, в самом обычном таком классе). Видимо, клипбоарду позарез нужен хендл на форму. Так что я уже научился доходить до такого:
<Immediate Window>
Clipboard.ContainsData(DataFormats.EnhancedMetafile)
true
Правда, после этого неизменно идет:
Clipboard.GetData(DataFormats.EnhancedMetafile)
null
Не веришь - могу выслать исходник и ворд-документ с картинкой ;)
Если никаких особенностей кода нет и присутствуют только пикчербокс и кнопка с одним событием - извините, я не настолько туп, чтоб такой код просить ;)
[/quote]
Да никто и не говорит, что ты тупой.
[QUOTE=dzeman]
Не веришь - могу выслать исходник и ворд-документ с картинкой ;)
[/QUOTE]
Давай ворд-документ с картинкой.
Однако, в классе клипбоард все равно какой-то недоступный, и что с этим делать - непонятно. Особенно если учесть, что метод класса запускается отдельным потоком в другом проекте, так что даже метод главной формы, который бы получал изображение из клипбоарда, не вызвать из-за кросс-референса...
Ладно, это уже лирика... Будем думать...
Спасибо за уделенное время...