Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Скриншоты рабочего стола и окна приветствия


Страницы:   1 2 3

Alex22 ©   (2009-02-17 15:41:00) 

Здравствуйте.

Есть задача постоянно создавать скриншоты рабочего стола, как под каким-либо пользователем так и в окне Winlogon.
Более подробно вопрос описан тут: http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=68586, однако подходящего решения проблемы на том форуме так и не подсказали (при использовании Synchronize скриншот получается белым в Winlogon, а при использовании TCriticalSection все казалось бы работает, но при клике на форму, либо ее перетаскивании вылетает ошибка "Out of system resources").

Если не затруднит, прошу помочь с решением задачи.


Alex22   (2009-02-20 15:01:00) [1]


> kami ©   (20.02.09 14:04) [49]

Спасибо! Буду пробовать...


kami   (2009-02-20 14:04:00) [2]

> [48] Alex22   (20.02.09 11:41)
> какая сессия запущена на текущий момент

В сервисе определяется через HandlerEx + MSDN


> [48] Alex22   (20.02.09 11:41)
> как определить сессию при запуске программы

WTSGetActiveConsoleSessionID+WTSQuerySessionInformation (afair)


Alex22   (2009-02-20 11:41:00) [3]

Хм... чет не получается простым путем, тогда несколько другой вопрос )
Есть ли возможность узнать (из-под сервиса и обычного пользователя), какой десктоп является текущим, т.е. какая сессия запущена на текущий момент?
Есть исходник определяющий момент переключения сессий, но в сервисе он не срабатывает, да и как определить сессию при запуске программы тоже непонятно, т.к. исходник отлавливает только ее переключение.
Есть какие-нибудь мысли?


Сергей М.   (2009-02-19 20:01:00) [4]


> Не, картина будет скрыта в трее,


А, ну да, тебе ж, конечно, виднее этот самый "трей" при еще НИ ОДНОМ активномдесктопе.

Ну и , соответсвенно, чего-то там туда "запуздыренное")


Alex22   (2009-02-19 17:35:00) [5]


> Картина маслом:

Не, картина будет скрыта в трее, и вызыватся если нужно кликом мыши, а так будет просто в трее висеть.

В TThread при использовании критической секции при клике на форму либо ее перетаскивании вылезает ошибка "Out of system resources" (повторяю уже наверное в сотый раз ))).

Прямой старт: при более ресурсоемких обработках изображения (не простом сохранении, а например применении какихлибо фильтров и т.п.) опять же выскакивает "Out of system resources".


Сергей М.   (2009-02-19 17:03:00) [6]


> заменил на BeginThread


Ну и заменил бы тогда уж на TThread - ты же, судя по коду, знаешь как с ним управляться и как присобачить в метод Execute крит.секцию..

А ты так и не ответил, за каким лешим понадобилась эта солянка из "прямого" старта потока и старта потока через TThread-оболочку)


Сергей М.   (2009-02-19 17:00:00) [7]


> так и в окне Winlogon


Картина маслом:

стартует Винда, появляется окно приветствия с приглашением выбрать уч.запись пользователя для входа в систему - и тут вдруг поверх нее как черт из табакерки выскакивает хрен знает что за форма с кучей "прочих элементов" и начинает "фотографировать" все что ни попадя..

Как вам оно покажется ?)


Alex22   (2009-02-19 16:59:00) [8]


> Eraser ©   (19.02.09 16:36) [42]

А можно поподробнее, что за такой "другой" подход?


> Ну так я не понял - ты убрал CreateThread ? Заменил на TThread
> или BeginThread ?Мало того, ты же в теле ф-ции ServiceThread()
> лезешь к синхронизируемому ресурсу напрямую, безо всяких
> крит.секций !

Да, заменил на BeginThread, а как правильно синхронизировать то?

function ServiceThread(P: Pointer): integer;
begin    
CriticalSection.Enter;
 msgPtr:=P;

 // InitActiveDesktop;

 Get_Screen;

CriticalSection.Leave;

//  ExitThread(0);
end;


Так?


Eraser   (2009-02-19 16:36:00) [9]

PS да, насчет скриншотов из сервиса. это допустимо только в XP и ранее и только в 0 терм. сессии. для остальных случаев прийдется использовать совершенно другой подход.


Eraser   (2009-02-19 16:31:00) [10]

> [37] Alex22   (19.02.09 16:27)


> А какой в Висте подход?
> И как тогда грамотно реализовать данную задачу?

эт я вопросом ошибся ) если требуется сделать скриншот, то подход тот же.


clickmaker   (2009-02-19 16:31:00) [11]

> На сохранении картинки - Bmp.SaveTofile...

для кого я подчеркнул? в коде VCL
Use debug dcu и зайди отладчиком туда


Сергей М.   (2009-02-19 16:30:00) [12]


> В общем она нужна


Зачем сервисуформа ?

У сервисов иные задачи - делать свое дело тихо-незаметно, без шума и пыли, никому не мешая и не обнаруживая свое присутствие.. На то они и сервисы, "демоны" по-линуксоидному, что, кстати, весьма точно отражает суть и назначение фоновыхслужб

Форма очевидна в обычном GUI-приложении, но никак не в сервис-приложении !

Ну так я не понял - ты убрал CreateThread ? Заменил на TThread или BeginThread ?

Мало того, ты же в теле ф-ции ServiceThread() лезешь к синхронизируемому ресурсу напрямую, безо всяких крит.секций !


Eraser   (2009-02-19 16:29:00) [13]

если есть несколько потоков, использующих TBitmap - работать с ним нужно очень осторожно. во-первых, при любом ображении блокировать с помощью внутреннего механизмаблокировки - TBitmap.Canvas.Lock; во-вторых, некоторые системные сообщения могут приводить к краху приложения, если оно использует TBitmap в доп. потоках (эти сообщения нужно блокировать).. все из-за кривизны рук у создателей Graphics в VCL.


Alex22   (2009-02-19 16:27:00) [14]


> clickmaker ©

На сохранении картинки - Bmp.SaveTofile...


> Eraser ©   (19.02.09 16:22) [35]

А какой в Висте подход?
И как тогда грамотно реализовать данную задачу?


Eraser   (2009-02-19 16:24:00) [15]

для взаимодействия с пользователем в логон-экране предусмотрены спец. средства. в XP это GINA.dll, в Vista - ICredentialProvider.


Eraser   (2009-02-19 16:22:00) [16]

> [33] Alex22   (19.02.09 16:11)

ты идешь по тупиковому пути. в висте это работать не будет. там другой подход.


clickmaker   (2009-02-19 16:19:00) [17]

> [33] Alex22   (19.02.09 16:11)

отследи в отладчике, где именно в коде VCLвылетает EOutOfResources


Alex22   (2009-02-19 16:11:00) [18]

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

В том то и прикол, что программно к форме обращений после запуска таймера нет, однако при взаимодействии состороны (в будущем оно будет, изменение настроек и т.п.) вылетает ошибка, что нехорошо.

Вот я и бъюсь с ее решением.

Вы моджете подсказать отностиельно тех же критических секций, что нужно сделать чтобы ошибка не возникала, без использования всяких try...except и т.п.? И почему они вообще возникают?
Я понимаю что дествительно тратися много ресурсов, но при Synchronize то такого не происходит, но к сожалению по ранее описанной причине его использовать не могу.


Сергей М.   (2009-02-19 15:55:00) [19]

Я про программноеобращение ..

Смотрю на твой юнит fServer и не вижу ни единого обращения к форме в контексте входа в крит.секцию

Да и зачем вообще тут нужна форма - это тоже совершенно не понятно..


Alex22   (2009-02-19 15:44:00) [20]


> И где же обращение к форме ?Ткни носом - в упор не вижу

Обращение - при клике на форму, ее перетаскивании и т.п.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо