Что нового

[НЕ Баг] Нерабочий GDIPlus после использования ClipPut

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Очень странно, помотрите на следующий пример:

Код:
#Include <ClipBoard.au3>
#Include <GDIPlus.au3>

$sFile = @DesktopDir & '\Screenshot.png'

ClipPut("")
Send('{PRINTSCREEN}')
Sleep(200)

_ClipBoard_Open(0)
$hBitmap = _ClipBoard_GetDataEx($CF_BITMAP)
_ClipBoard_Close()

;ClipPut("Data")

If $hBitmap Then
	_GDIPlus_Startup()
	$hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
	$Result = _GDIPlus_ImageSaveToFile($hImage, $sFile)
	_WinAPI_DeleteObject($hBitmap)
	_GDIPlus_ImageDispose($hImage)
	_GDIPlus_Shutdown()
	
	If FileExists($sFile) Then
		ShellExecuteWait($sFile)
		FileDelete($sFile)
	EndIf
EndIf


Если раскомментировать строчку с ClipPut, то файл со снимком не создаётся, _GDIPlus_BitmapCreateFromHBITMAP просто не возвращает $hImage.

В чём может быть дело?

Подозреваю что оно как то связано с памятью и высвобождением объектов...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: [Баг] Нерабочий GDIPlus после использования ClipPut

Потому что _ClipBoard_GetDataEx() не создает битмап, а ссылается на то, что в данный момент находится в буфере. Т.к. ClipPut() затирает данные в буфере, то использовать $hBitmap после этого не имеет смысла. Кстати, освобождать $hBitmap тоже не нужно. В принципе, это написано в описании к функции _ClipBoard_GetDataEx().

:smile:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: [Баг] Нерабочий GDIPlus после использования ClipPut

Yashied [?]
Т.к. ClipPut() затирает данные в буфере, то использовать $hBitmap после этого не имеет смысла
Так а как тогда решить эту проблему?

Т.е получается нужно сначала конвертировать в $hImage, а потом заполнять буфер обмена?
Это не очень хорошее решение(?)...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: [Баг] Нерабочий GDIPlus после использования ClipPut

Почему не очень хорошее? Если очень хочется, то можно скопировать битмап:

Код:
_ClipBoard_Open(0)
$hBitmap = _WinAPI_CopyImage(_ClipBoard_GetDataEx($CF_BITMAP))
_ClipBoard_Close()
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: [Баг] Нерабочий GDIPlus после использования ClipPut

Yashied [?]
Почему не очень хорошее?
Потому что мне нужно сделать функцию которая будет возвращать $hImage для дальнейшей работы с ним, но содержимое буфера должна восстанавливать сама функция, вот поэтому возникают проблемы.

Если очень хочется, то можно скопировать битмап
Щас попробуем...


Добавлено:
Сообщение автоматически объединено:

Yashied [?]
можно скопировать битмап
Супер, то что нужно!

P.S
В справке немного смутно написано, я долго сидел и вдумывался, я бы никогда не догадался что _ClipBoard_GetDataEx ссылается на объект в буфере обмена. Там написано что нужно немедленно копировать данные, а как это сделать, не написано, должны были как минимум предоставить для этого функцию, типа _ClipBoard_CopyData.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Эта библиотека есть реализация API, _ClipBoard_CopyData() не логична по той причине, что для каждого типа данных нужны свои методы копирования, структуры и т.д. И в большинстве случаев в этом нет никакой необходимости.
 
Верх