![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скриншоты рабочего стола и окна приветствия
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]
> И где же обращение к форме ?Ткни носом - в упор не вижу
Обращение - при клике на форму, ее перетаскивании и т.п.