![]() |
| ||
|
|
Новости |
Поиск |
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").
Если не затруднит, прошу помочь с решением задачи.
Сергей М. (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) ничего не дает.