PDA

Просмотр полной версии : AIR приложение. Нужно сделать скриншот всего экрана.


terbooter
03.12.2012, 00:48
Задача: снять скриншот со всего экрана в AIR приложении.
Одними средствами AIR не обойтись. Нужно использовать native extension.
Пока нужно только для windows, в перспективе для linux и mac.

Нашел два проекта:
1) https://github.com/pcichon/ScreenShooter
На одной машине работает прекрасно. На другой жалуется что нет библиотеки сишной msvcr100.dll
2) Nitro Screen Cap (https://sites.google.com/a/simplifiedlogic.com/nitroscreencap/home/getting-started) Но сайт с лицензиями лежит. Саппорт не отвечает.

Кто решал подобную задачу, поделитесь опытом.

alexcon314
03.12.2012, 09:11
А чего решать, если работает?
На другой жалуется что нет библиотеки сишной msvcr100.dll
Положите msvcr100.dll рядом с dll экстенжена. Это студийный рантайм, к сожалению в проекте CLR нельзя его слинковать статически, потому приходится таскать с собой. Этот рантайм можно поставить отдельно, так многие проги делают. Погугли vcredist*, vc redistributable package. Ну или вынуть из этого пакажа рантайм и положить рядом, как я сказал.
PS. Вообще, можно избавиться от этой проблемы, переписав длл экстенжена на чистом WIN API, там всего-то одна функция, пример ее реализации без CLR можно опять же нагуглить за 5 минут.

terbooter
03.12.2012, 11:39
Спасибо за помощь!
Собственно вот код экстеншена (https://github.com/pcichon/ScreenShooter/blob/master/ScreenShooterVS2010/ScreenShooter/ScreenShooter.cpp)
Подскажите, какие методы заменить, чтобы было на чистом WIN API

alexcon314
03.12.2012, 13:04
Надо преобразовать проект весь студийный, убрать поддержку CLR, включить линковку статическую с рантаймом, из кода выкинуть "управляемые" инструкции, заменить их на сишные аналоги. В основном в части преобразования полученного битмапа в массив байтов для возврата во флеш. Вот это точно надо заменить:

MemoryStream^ stream = gcnew MemoryStream();
Bitmap^ bitmap = Image::FromHbitmap((IntPtr)hbmScr);
bitmap->Save(stream, ImageFormat::Png);
array<Byte>^ raw = stream->ToArray();
uint8_t* output = new uint8_t[iXRes * iYRes * 4];
int outputSize = (int) stream->Length;
Marshal::Copy(raw, 0, (IntPtr) output, outputSize);

Плюсом будет независимость от .NET Framework.
Если есть прогер сишник толковый под рукой - делов немного. Потом перекомпилить весь проект, получится длл экстенжена без CLR. Ее и пробовать юзать.
И да, преобразование в ПНГ - это как бы опция, можно в jpeg, bmp отдать картинку. Для простоты кода преобразования форматов, в виндах пользуется gdiplus, это как бы еще одна зависимость, но насколько я знаю эта либа сидит во всех виндах по умолчанию, начиная с XP, или даже раньше, проблем быть не должно.
Совсем попростому - опять же положить рантайм рядом с экстенженом и не париться.
ПС. Немного смущает, что экстенжены для айра пишут в виндах на CLR, что-то совсем нативных примеров не встречал, странно как-то..

terbooter
03.12.2012, 13:32
Попробовал положить длл рядом:
1) Взял свою длл из c:\Windows\System32\msvcr100.dll
2) Упаковал в инсталлятор
"d:\flex_sdk_4.6\bin\adt.bat" -package -storetype pkcs12 -keystore test.p12 -storepass test -target ane ScreenShooter.ane extension.xml -swc ScreenShooter.swc -platform Windows-x86 library.swf ScreenShooter.dll msvcr100.dll
3) Удалил старую версию скриншотера. Установил новую.
В папке появилась нужная длл
C:\Program Files\ScreenShooterTest\META-INF\AIR\extensions\com.genesi.desktop.ScreenShooter\META-INF\ANE\Windows-x86
4) При запуске точно так же ругается, что нет msvcr100.dll

alexcon314
03.12.2012, 13:49
эмм.. неточно выразился. попробуй положить msvcr100.dll в рабочую папку приложения, т.е. откуда запуск происходит. не надо ее паковать вместе с экстенженом.

terbooter
03.12.2012, 14:23
Спасибо еще раз.
После добавления msvcr100.dll, программа потребовала еще msvcp100.dll.
После этого запустилась.
Запаковал длл-ки как дополнительные файлы в AIR инсталлятор.

viclight
25.01.2013, 00:02
Под 7 почему то падает все приложение. Может кто то пробовал под 7 и получилось. Поделитесь пожалуйста.