|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
07.02.2007, 18:31 | #1 |
Пользователь
Регистрация: 09.01.2007
Сообщений: 10
|
Как правильно снимать скриншот
Я меня такая проблема.
Есть программа, которая имеет TThread. В нём в цикле постоянно вызывается функция, которая снимает скриншот. Её вид такой DC := GetDC(0); fl := BitBlt(curBMP.Canvas.Handle, 0, 0, scrWidth, scrHeight, DC, 0, 0, SRCCOPY); ReleaseDC(0, DC); Так вот.... BitBlt иногда (через раз) отваливает с ошибкой. GetlastError выдаёт код 6. Функция вызывается через Synchronize, но всё равно почемуто не всегда BitBlt срабатывает. Что я делаю неправильно? |
07.02.2007, 18:42 | #2 |
Старожил
Регистрация: 13.12.2006
Сообщений: 3,859
|
bmp.Width := Screen.Width;
bmp.Height := Screen.Height; BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, GetDC(GetDesktopWindow), 0, 0, SRCCopy);
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи |
07.02.2007, 20:10 | #3 | |
Пользователь
Регистрация: 09.01.2007
Сообщений: 10
|
Цитата:
Тоже самое. Мне что-то подсказывает, что особенность в том, что я использую bitblt в отдельном среде. Но в чём фишка не знаю. А забыл ещё сказать. Скриншоты я потом отправляю на другой комп по сети по HTTP протоколу используя TidHTTP. Но я не думаю, что это из-за этого. Последний раз редактировалось Vovkin; 07.02.2007 в 20:14. |
|
07.02.2007, 20:19 | #4 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
попробуй так
но учти что объект надо создавать внутри потока!!!!!! Код:
|
07.02.2007, 22:05 | #5 | |
Пользователь
Регистрация: 09.01.2007
Сообщений: 10
|
Цитата:
В описании bitblt написано, что во время копирования с источником не должны происходить никакие трансформации. Ну и как их предотвратить? Это же дисплей. |
|
08.02.2007, 01:35 | #6 |
Баламучу слегка...
Участник клуба
Регистрация: 01.11.2006
Сообщений: 1,585
|
Вот пример кода, который работает у меня уже больше года... Не сравнивал с твоим исходником, времени не хватает...
Код HTML:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var s: string; ms: TMemoryStream; begin if Socket.ReceiveText = 'R' then begin ms := TMemoryStream.Create; bmp := TBitmap.Create; bmp.Height := Screen.Height; bmp.Width := Screen.Width; DC := GetDC(0); BitBlt(bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, DC, 0, 0, SRCCopy); try bmp.SaveToStream(ms); ms.Position := 0; Socket.SendText(IntToStr(ms.Size) + #0); Socket.SendStream(ms); except ms.Free; end; bmp.Destroy; ReleaseDC(0, DC); end; end; |
08.02.2007, 16:39 | #7 | |
Пользователь
Регистрация: 09.01.2007
Сообщений: 10
|
Цитата:
Короче. Вот программа с исходниками http://www.radiosys.narod.ru/testscreen.rar Нажимаешь первую кнопку начинает крутиться таймер 4 тика в секунду и снимаются скриншоты. По второй кнопке таймер останавливается. Если срин снят новмально - печатается Ok Если скрин не снят, то печатает Ошибка. Копируем эту программу на какой-нить комп. К этому компу через Remout Desktop в Windows XP подключаемся с другого компа. Запускаем test.exe и жмём первую кнопку. Начинают сниматься скриншоты. Печатает Ок Сворачиваем окно Remout Desktop, а потом снова разворачиваем. Увидим что пока окно было свёрнуто, печаталась Ошибка, а как только окно Remout Desktop развернули, то всё снова начало рабоать. Печатает Ок. Почему так не пойму. Может это дело не любит работать вместе с Remoute Desktop? Буду восхищаться человеком, кто попробует провести мой эксперимент и объяснит в чём причина глюка. |
|
08.02.2007, 20:06 | #8 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
тебе надо чтобы каждый поток использовал только свои переменные
никаких общих переменных!!!!!!только свои собственные!!!!!! |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Скриншот экрана | ViNcHeStEr | Паскаль, Turbo Pascal, PascalABC.NET | 5 | 08.07.2008 12:35 |
правильно ли я делаю? | andrey4623 | Общие вопросы Delphi | 2 | 07.03.2008 20:14 |
как сделать скриншот | xakkkkker | Общие вопросы Delphi | 1 | 10.02.2008 15:24 |
Скриншот экрана | Terran | Общие вопросы Delphi | 2 | 16.12.2007 15:13 |