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").

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


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

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


Alex22   (2009-02-19 14:53:00) [22]

В данном коде нет, просто я поторопился...
Ну а во время работы программы (при клике на форму, ее перетаскивании и т.п.) возникает ошибка "Out of system resources".
Почему она возникакет и можно ее как-то избежать?


Сергей М.   (2009-02-19 14:48:00) [23]

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


Alex22   (2009-02-19 14:45:00) [24]

В смысле пи клике на форму, перетаскивании и т.п.


Alex22   (2009-02-19 14:38:00) [25]


procedure Get_Screen;
var
 dc: hDC;
begin
 DC:=GetDC(GetDesktopWindow); // Получаем дескpиптоp экpана
 BitBlt(Bmp.Canvas.Handle,0,0,Screen.Width,Screen.Height,dc,0,0,SRCCOPY); // Копируем содержимое экрана
 ReleaseDC(GetDesktopWindow,dc);

 Bmp.SaveToFile(ExtractFilePath(ParamStr(0))+'\screen_'+Format('%0.3d',[fr_num])+'.bmp');
end;

procedure TGet_ScreenThread.Execute;
begin
 // Synchronize(SaveBmp);

 CriticalSection.Enter;

 inc(fr_num);
 InitActiveDesktop;
 Get_Screen;

 CriticalSection.Leave;
end;

procedure TfrmServer.Timer3Timer(Sender: TObject);
begin
GetScrThrd:=TGet_ScreenThread.Create(true);
GetScrThrd.FreeOnTerminate:=true;
GetScrThrd.Resume;
end;


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

А где у тебя такое обращение к форме ?
Цитируй фрагмент кода ..


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

И все таки, вопрос: можно как-то избежать ошибки при использовании CriticalSection (возникают при взаимодействии с формой)?


Alex22   (2009-02-18 14:06:00) [28]


> Основное - в см. справку по IsMultiThread = True

ОК, сенькс за наводку, буду копать справку...


Сергей М.   (2009-02-18 13:54:00) [29]


> в чем состоит это различие


Основное - в см. справку по IsMultiThread = True


clickmaker   (2009-02-18 13:51:00) [30]

> А в чем состоит это различие

BeginThread - правая кнопка - Find Declaration


Alex22   (2009-02-18 13:49:00) [31]

А в чем состоит это различие (в нете покопался, но толкового разъяснения не нашел)?


Сергей М.   (2009-02-18 13:32:00) [32]


> В интернете откопал


Т.е. ты вообщене задавался мыслью выяснить, чем принципиальноотличаются CreateThread от BeginThread и почему класс TThread создает поток вызовом именно BeginThread, а не CreateThread ?

Малацца, далеко пойдешь)


Alex22   (2009-02-18 13:22:00) [33]


> Это кто ж тебе насоветовал использовать именно CreateThread
> ?BeginThread следует использовать !

В интернете откопал )), да и CreateThread/BeginThread там чисто для тестирования, а работать нужно заставить именно TThread.

ПС. Использую Delphi 7.


clickmaker   (2009-02-18 13:10:00) [34]

еще бы версию дельфи нефигово сказать. Потому что реализации SaveToFile могут отличаться


Сергей М.   (2009-02-18 13:03:00) [35]


> Alex22   (18.02.09 12:53) [14]


> hThread:= CreateThread(nil, 0,

Это кто ж тебе насоветовал использовать именно CreateThread ?
BeginThread следует использовать !

И что за солягка сборная из TThread и CreateThread ?


clickmaker   (2009-02-18 13:02:00) [36]

> Ошибка возникает на строке

а глубже-то не пробовал заходить?


Alex22   (2009-02-18 12:53:00) [37]

Тестирую под XP.
Ошибка возникает на строке
Bmp.SaveToFile(ExtractFilePath(ParamStr(0))+'\screen_'+Format('%0.3d',[fr_num])+'.bmp');


clickmaker   (2009-02-18 12:45:00) [38]

а в режиме формы в отладчике по стеку вызовов при "Out of system resources" не видно, откуда оно выбрасывается?


clickmaker   (2009-02-18 12:39:00) [39]

> В данном случае это играет какую-то роль для решения задачи?

зачем лишний посредник в лице таймера?
while not Terminated do begin
 SaveBmp;
 Sleep(100);
end;


> исправление на ReleaseDC(GetDesktopWindow,dc) ничего не
> дает

под какой ОС нехватка ресурсов? На 2003 у меня нормально работает


Alex22   (2009-02-18 12:30:00) [40]


> почему поток ServiceThread стартует по таймеру, а не организован
> цикл с задержкой внутри самого потока?

В данном случае это играет какую-то роль для решения задачи?

> почему берем GetDC(GetDesktopWindow), а ReleaseDC(0 ?

Да, несоответствие, но исправление на ReleaseDC(GetDesktopWindow,dc) ничего не дает.


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

Наверх

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