Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2007, 18:31   #1
Vovkin
Пользователь
 
Регистрация: 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 срабатывает.
Что я делаю неправильно?
Vovkin вне форума Ответить с цитированием
Старый 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
Vovkin
Пользователь
 
Регистрация: 09.01.2007
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Квэнди Посмотреть сообщение
bmp.Width := Screen.Width;
bmp.Height := Screen.Height;
BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height,
GetDC(GetDesktopWindow), 0, 0, SRCCopy);
Да и так делал.
Тоже самое.
Мне что-то подсказывает, что особенность в том,
что я использую bitblt в отдельном среде.
Но в чём фишка не знаю.
А забыл ещё сказать.
Скриншоты я потом отправляю на другой
комп по сети по HTTP протоколу используя
TidHTTP. Но я не думаю, что это из-за этого.

Последний раз редактировалось Vovkin; 07.02.2007 в 20:14.
Vovkin вне форума Ответить с цитированием
Старый 07.02.2007, 20:19   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

попробуй так
но учти что объект надо создавать внутри потока!!!!!!
Код:
Var
 Desktop :TCanvas ;
 BitMap  :TBitMap;

begin
  DesktopCanvas:=TCanvas.Create;
  DesktopCanvas.Handle:=GetDC(Hwnd_Desktop);
  BitMap := TBitMap.Create;
  BitMap.Width := Screen.Width;
  BitMap.Height:=Screen.Height;
  Bitmap.Canvas.CopyRect(Bitmap.Canvas.ClipRect,
  DesktopCanvas, DesktopCanvas.ClipRect);
  ........
end;
rpy3uH вне форума Ответить с цитированием
Старый 07.02.2007, 22:05   #5
Vovkin
Пользователь
 
Регистрация: 09.01.2007
Сообщений: 10
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
попробуй так
но учти что объект надо создавать внутри потока!!!!!!
Код:
Var
 Desktop :TCanvas ;
 BitMap  :TBitMap;

begin
  DesktopCanvas:=TCanvas.Create;
  DesktopCanvas.Handle:=GetDC(Hwnd_Desktop);
  BitMap := TBitMap.Create;
  BitMap.Width := Screen.Width;
  BitMap.Height:=Screen.Height;
  Bitmap.Canvas.CopyRect(Bitmap.Canvas.ClipRect,
  DesktopCanvas, DesktopCanvas.ClipRect);
  ........
end;
Не помогает. :-(
В описании bitblt написано, что во время копирования с источником
не должны происходить никакие трансформации.
Ну и как их предотвратить? Это же дисплей.
Vovkin вне форума Ответить с цитированием
Старый 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
Vovkin
Пользователь
 
Регистрация: 09.01.2007
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Баламут Посмотреть сообщение
Вот пример кода, который работает у меня уже больше года... Не сравнивал с твоим исходником, времени не хватает...

[/html]
Да не работает ни так ни сяк.
Короче.
Вот программа с исходниками http://www.radiosys.narod.ru/testscreen.rar
Нажимаешь первую кнопку начинает крутиться таймер
4 тика в секунду и снимаются скриншоты.
По второй кнопке таймер останавливается.
Если срин снят новмально - печатается Ok
Если скрин не снят, то печатает Ошибка.
Копируем эту программу на какой-нить комп.
К этому компу через Remout Desktop в Windows XP
подключаемся с другого компа.
Запускаем test.exe и жмём первую кнопку.
Начинают сниматься скриншоты. Печатает Ок
Сворачиваем окно Remout Desktop, а потом
снова разворачиваем. Увидим что пока окно было
свёрнуто, печаталась Ошибка, а как только
окно Remout Desktop развернули, то всё снова
начало рабоать. Печатает Ок.
Почему так не пойму. Может это дело не любит
работать вместе с Remoute Desktop?
Буду восхищаться человеком, кто попробует провести
мой эксперимент и объяснит в чём причина глюка.
Vovkin вне форума Ответить с цитированием
Старый 08.02.2007, 20:06   #8
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

тебе надо чтобы каждый поток использовал только свои переменные
никаких общих переменных!!!!!!только свои собственные!!!!!!
rpy3uH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скриншот экрана 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