|
70 / 71 / 19
Регистрация: 01.05.2013
Сообщений: 279
|
||||||
SetClipboardData (user32.dll) bitmap07.07.2019, 14:23. Показов 2997. Ответов 7
Здравствуйте.
Столкнулся с проблемой: мне нужно скопировать изображение (снимок экрана) в буфер обмена. Из-за тех. ограничений я не могу использовать System.Windows.Forms.Clipboard. Вместо этого я использую функцию SetClipboardData из библиотеки user32.dll. Текст вставляется в буфер без проблем, но картинки, которые функция отправляет в буфер (возвращает true, то есть ошибки нет) невозможно открыть в paint (он не видит, что в буфере есть картинка) ("Данные из буфера обмена невозможно вставить"). Судя по информации, которую я смог найти в интернете, проблема связана с тем, что формат CF_BITMAP не будет распознан как картинка (возможно это не так, но несколько тем на MSDN утверждают именно это). В качестве решения предлагается использовать CF_DIB. Но я не могу найти, как преобразовать bitmap в DIB. Обычный bitmap он не принимает в качестве аргумента. Мой код:
0
|
||||||
| 07.07.2019, 14:23 | |
|
Ответы с готовыми решениями:
7
Problems with user32.dll
Оптимизация опрашивания нажатых клавиш (user32.dll) |
|
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
|
|
| 10.07.2019, 12:19 | |
|
0
|
|
|
70 / 71 / 19
Регистрация: 01.05.2013
Сообщений: 279
|
|||||||||||||||||
| 10.07.2019, 12:45 [ТС] | |||||||||||||||||
|
Ошибка в строке:
Кликните здесь для просмотра всего текста
NullReferenceException: Object reference not set to an instance of an object
at System.Drawing.ComIStreamMarshaler+Manag edToNativeWrapper..cctor () [0x00049] in <b26f6e18402e40bfbefc667aa5eb39a0>:0 Rethrow as TypeInitializationException: The type initializer for 'ManagedToNativeWrapper' threw an exception. ... Большинство функций S.W.F. работает только в редакторе, а после компиляции возвращают ошибки. Из-за этого почти все функции, которые можно легко сделать с помощью этой dll, приходится делать через PInvoke. Так как использование этой библиотеки в Unity - редкость, комментариев по этой проблеме не много, и кажется, что некоторые функции всё же могут работать, но не все. Возможно проблема не только в S.W.F., но и в самой функции Clipboard.SetImage (Например, System.Drawing работает без ошибок). Edit: Так же, строка
Добавлено через 10 минут Полный текст ошибки: Кликните здесь для просмотра всего текста
NullReferenceException: Object reference not set to an instance of an object
at System.Drawing.ComIStreamMarshaler+Manag edToNativeWrapper..cctor () [0x00049] in <b26f6e18402e40bfbefc667aa5eb39a0>:0 Rethrow as TypeInitializationException: The type initializer for 'ManagedToNativeWrapper' threw an exception. at System.Drawing.ComIStreamMarshaler.Marsh alManagedToNative (System.Object managedObj) [0x00000] in <b26f6e18402e40bfbefc667aa5eb39a0>:0 at (wrapper managed-to-native) System.Drawing.GDIPlus.GdipSaveImageToSt ream(System.Runtime.InteropServices.Hand leRef,System.Runtime.InteropServices.Com Types.IStream,System.Guid&,System.Runtim e.InteropServices.HandleRef) at System.Drawing.Image.Save (System.IO.Stream stream, System.Drawing.Imaging.ImageCodecInfo encoder, System.Drawing.Imaging.EncoderParameters encoderParams) [0x0007e] in <b26f6e18402e40bfbefc667aa5eb39a0>:0 at System.Drawing.Image.Save (System.IO.Stream stream, System.Drawing.Imaging.ImageFormat format) [0x00029] in <b26f6e18402e40bfbefc667aa5eb39a0>:0 at (wrapper remoting-invoke-with-check) System.Drawing.Image.Save(System.IO.Stre am,System.Drawing.Imaging.ImageFormat) at System.Windows.Forms.XplatUIWin32.ImageT oDIB (System.Drawing.Image image) [0x0000d] in <74221ab25db54b76800a8d2a7149b899>:0 at System.Windows.Forms.XplatUIWin32.Clipbo ardStore (System.IntPtr handle, System.Object obj, System.Int32 type, System.Windows.Forms.XplatUI+ObjectToCli pboard converter) [0x000cf] in <74221ab25db54b76800a8d2a7149b899>:0 at System.Windows.Forms.XplatUI.ClipboardSt ore (System.IntPtr handle, System.Object obj, System.Int32 type, System.Windows.Forms.XplatUI+ObjectToCli pboard converter) [0x00000] in <74221ab25db54b76800a8d2a7149b899>:0 at System.Windows.Forms.Clipboard.SetDataOb jectImpl (System.Object data, System.Boolean copy) [0x00091] in <74221ab25db54b76800a8d2a7149b899>:0 at System.Windows.Forms.Clipboard.SetDataOb ject (System.Object data, System.Boolean copy, System.Int32 retryTimes, System.Int32 retryDelay) [0x0003e] in <74221ab25db54b76800a8d2a7149b899>:0 at System.Windows.Forms.Clipboard.SetDataOb ject (System.Object data, System.Boolean copy) [0x00000] in <74221ab25db54b76800a8d2a7149b899>:0 at System.Windows.Forms.Clipboard.SetDataOb ject (System.Object data) [0x00000] in <74221ab25db54b76800a8d2a7149b899>:0 at System.Windows.Forms.Clipboard.SetData (System.String format, System.Object data) [0x00019] in <74221ab25db54b76800a8d2a7149b899>:0 at System.Windows.Forms.Clipboard.SetImage (System.Drawing.Image image) [0x00011] in <74221ab25db54b76800a8d2a7149b899>:0 at ClipboardTest.Update () [0x0006e] in D:\Proj\Assets\ClipboardTest.cs:53 Пробовал разные способы (например, Image.FromHbitmap(bitmap.GetHbitmap())), которые смог найти. Везде: в редакторе работает, в сборке - нет.
0
|
|||||||||||||||||
|
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
|
|
| 10.07.2019, 12:53 | |
|
0
|
|
|
70 / 71 / 19
Регистрация: 01.05.2013
Сообщений: 279
|
||
| 10.07.2019, 12:55 [ТС] | ||
|
Т. к. PInvoke работают так же, как в в обычном шарпе, код из первого поста тестировался не (только) в Unity, а в обычном Windows Form приложении.
0
|
||
|
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
|
||
| 10.07.2019, 16:04 | ||
|
Возможно paint требует именно OLE обьект, а не raw bitmap, непонятно... Добавлено через 1 минуту И еще в вашем коде нет копирования обьекта в unmanaged память, без этого точно не будет работать корректно. Но я пробовал с копированием - тоже не работает.
0
|
||
|
70 / 71 / 19
Регистрация: 01.05.2013
Сообщений: 279
|
||||||||
| 10.07.2019, 17:12 [ТС] | ||||||||
|
Кликните здесь для просмотра всего текста
Application version: paint.net версия 4.1.6
System.Exception: GetClipboardData() returned NULL (0, ERROR_SUCCESS) ---> System.ComponentModel.Win32Exception: GetClipboardData() returned NULL (0, ERROR_SUCCESS) в PaintDotNet.SystemLayer.NativeUtilities. ThrowOnWin32Error(String message, Int32 lastWin32Error, Boolean alwaysThrow) в D:\src\pdn\src\SystemLayer\NativeUtiliti es.cs:строка 88 в PaintDotNet.SystemLayer.ClipboardTransac tion.TryGetRawNativeData(UInt32 formatID, Action`1 readDataCallback) в D:\src\pdn\src\SystemLayer\ClipboardTran saction.cs:строка 241 в PaintDotNet.ClipboardImageHelper.DibImag eRetriever.OnTryGetDataT(IClipboardTrans action clipTx) в D:\src\pdn\src\PaintDotNet\ClipboardImag eHelper.cs:строка 270 в PaintDotNet.ClipboardDataRetriever`1.Try GetData(IClipboardTransaction clipTx) в D:\src\pdn\src\PaintDotNet\ClipboardData Retriever`1.cs:строка 29 в PaintDotNet.ClipboardUtil.TryGetData[T](IClipboardTransaction clipTx, IReadOnlyList`1 retrievers) в D:\src\pdn\src\PaintDotNet\ClipboardUtil .cs:строка 58 --- Конец трассировки внутреннего стека исключений --- в PaintDotNet.ClipboardUtil.TryGetData[T](IClipboardTransaction clipTx, IReadOnlyList`1 retrievers) в D:\src\pdn\src\PaintDotNet\ClipboardUtil .cs:строка 113 в PaintDotNet.ClipboardImageHelper.TryGetI mage(IClipboardTransaction clipTx) в D:\src\pdn\src\PaintDotNet\ClipboardImag eHelper.cs:строка 74 в PaintDotNet.Actions.PasteImageAction.<Pe rformActionImpl>b__6_0() в D:\src\pdn\src\PaintDotNet\Actions\Paste ImageAction.cs:строка 103 в PaintDotNet.Runtime.RetryManager.<>c__Di splayClass7_0`1.<RunMemorySensitiveOpera tion>b__0() в D:\src\pdn\src\Base\Runtime\RetryManager .cs:строка 139 в PaintDotNet.Runtime.RetryManager.RunMemo rySensitiveOperation(Int32 maxAttempts, Action action) в D:\src\pdn\src\Base\Runtime\RetryManager .cs:строка 168 в PaintDotNet.Runtime.RetryManager.RunMemo rySensitiveOperation[T](Int32 maxAttempts, Func`1 func) в D:\src\pdn\src\Base\Runtime\RetryManager .cs:строка 144 в PaintDotNet.Actions.PasteImageAction.Per formActionImpl() в D:\src\pdn\src\PaintDotNet\Actions\Paste ImageAction.cs:строка 81 Код:
0
|
||||||||
|
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
|
|
| 10.07.2019, 17:48 | |
|
Извините ошибся, GetHbitmap как раз создает обьект в unmanaged памяти.
Но структура обьекта не та которая должна быть. Я бы поискал какой нибудь опенсорсный графический редактор на C++ и посмотрел бы какие api там используются для добавления изображения в буфер обмена
0
|
|
| 10.07.2019, 17:48 | |
|
Помогаю со студенческими работами здесь
8
SendInput() (user32.dll) работает с разными приложениями по разному
Не работает GetLastInputInfo из user32.dll: время увеличивается несмотря на активность устройств ввода Найти окно стороннего приложения зная его id и нажать 1 кнопку, но без использования user32.dll Нарисовать прошлый Bitmap на новом так, чтобы небыл растянут рисунок, если новый Bitmap больше размером Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html
Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
|
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
|