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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2011, 20:49   #1
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
Восклицание Сделать Print Screen в игре

Код:

Width := Screen.Width;
Height := Screen.Height;
BitBlt(Canvas.Handle, 0, 0, Width, Height, GetDC(GetDesktopWindow), 0, 0, SRCCOPY);
SaveToFile(PathToSave);
Free;

Уходит корнями аж к 2000 годам, и несмотря на это, он вполне рабочий и пригоден для снятия скриншотов с экрана. НО! Заметил особенность, что в играх он иногда не работает, т.е. получаем в файл чёрный экран. Проследил особенность, на всех XP машинах всё отлично, а на некоторых машинах под 7 получается чёрный экран. Сам являюсь этим счастливчиком, в вин 7, если сфотать в игре, то картинки чёрные будут. Хотя у знакомого на вин7 получается нормальный результат.

Господа, а теперь вопрос - какими средствами в Delphi ещё можно попробовать снять скриншот, чтобы он нормально получился, даже если фотать в играх?
Или может кто-то сталкивался с этим и знает где в вин7 галочку убрать "Фотать чёрный экран"?
_KUL вне форума Ответить с цитированием
Старый 28.04.2011, 14:05   #2
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию

Кстати, если на вин7 стоит сп1, то совсем не фотает ... Как быть? Чем можно скриншот снять в игре?
_KUL вне форума Ответить с цитированием
Старый 28.04.2011, 19:27   #3
MyLastHit
Очень суровый
Участник клуба
 
Аватар для MyLastHit
 
Регистрация: 17.12.2009
Сообщений: 1,988
По умолчанию

через getasynckeystate ловить 9A(вирт код ПртСкр), извлекать из буфера обмена картинку.
Ненавижу быть как все, но люблю, чтобы все были как я.
MyLastHit вне форума Ответить с цитированием
Старый 29.04.2011, 13:18   #4
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию

а можете кусочек кода показать?
_KUL вне форума Ответить с цитированием
Старый 29.04.2011, 14:41   #5
MyLastHit
Очень суровый
Участник клуба
 
Аватар для MyLastHit
 
Регистрация: 17.12.2009
Сообщений: 1,988
По умолчанию

Ну вот вам кусочек
Код:
if getasynckeystate(9A) then
Ненавижу быть как все, но люблю, чтобы все были как я.
MyLastHit вне форума Ответить с цитированием
Старый 29.04.2011, 15:21   #6
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию

Т.е. этой функцией отловить нажатие клавиши прин-скрин? Да нет, мне не клавиша, нужна, я экран сфотать хочу, в джпег пережать и сохранить. Проблема только с тем, как сфотать? Под вин7 код из первого поста неработает ...
_KUL вне форума Ответить с цитированием
Старый 29.04.2011, 22:30   #7
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

У меня код из первого сообщения работает.
eduard93 вне форума Ответить с цитированием
Старый 29.04.2011, 23:23   #8
MyLastHit
Очень суровый
Участник клуба
 
Аватар для MyLastHit
 
Регистрация: 17.12.2009
Сообщений: 1,988
По умолчанию

_KUL, все дело в том как ты скринишь. Я понял так: зашел в игру нажал PrtScr и картинка сохраняется на раб. стол например.
Или ты фоткаешь со свернутой игрой, нажимая например на кнопку в своем приложении?
Ненавижу быть как все, но люблю, чтобы все были как я.
MyLastHit вне форума Ответить с цитированием
Старый 30.04.2011, 11:01   #9
_KUL
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 96
По умолчанию

Вот код, как он работает:

procedure TForm1.Button1Click(Sender: TObject);
var
DC : HDC;
bmp : TBitmap;
jpgImg: TJPEGImage;
today : TDateTime;
IDFTP: TIDFTP;
i, i_y, rand:integer;
hiser:string;
begin
today := now;
nowdate := datetostr(today);
nowtime := timetostr(today);
namephoto := nowdate[7]+nowdate[8]+nowdate[9]+nowdate[10]+'.'+nowdate[4]+nowdate[5]+'.'+nowdate[1]+nowdate[2];
if nowtime[2]=':' then
begin
nowtime[8] := nowtime[7];
nowtime[7] := nowtime[6];
nowtime[6] := nowtime[5];
nowtime[5] := nowtime[4];
nowtime[4] := nowtime[3];
nowtime[3] := nowtime[2];
nowtime[2] := nowtime[1];
nowtime[1] := '0';
end;
rand := random(99);
namephoto := namephoto+'-'+nowtime[1]+nowtime[2]+'.'+nowtime[4]+nowtime[5]+'.'+nowtime[7]+nowtime[8]+'-'+inttostr(rand)+'.jpg';
bmp := TBitmap.Create;
jpgImg := TJPEGImage.Create;
bmp.Height := Screen.Height;
bmp.Width := Screen.Width;
DC := GetDC(0);
//bitblt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DC, 0, 0, SRCCOPY);
BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, GetDC(GetDesktopWindow), 0, 0, SRCCopy);
ReleaseDC(0, DC);

with bmp.Canvas do
begin
font.Size := 16;
font.Color := clBlue;
end;
bmp.Canvas.TextOut(5,5,memo2.Lines. Text);
bmp.Canvas.TextOut(5,30,label1.Capt ion);
jpgImg.Assign(bmp);
jpgImg.CompressionQuality:=40;
jpgImg.SaveToFile('cache\main\'+nam ephoto);
jpgImg.Free;
bmp.Free;
idftp:=TIDFtp.create(IDFTP);
idftp.host:='***';
idftp.Port:=21;
idftp.Username:='***';
idftp.password:='***';

try
IdFTP.Connect; //Соединяемся
If IdFTP.Connected then
Begin
idftp.Put('cache\main\'+namephoto,n amephoto,true);
IdFTP.Disconnect; //Завершаем соединение
idUDPclient1.Send(T+' - Загружено фото '+namephoto);
end;
except
idUDPclient1.Send(T+' - Ошибка передачи фото по FTP');
end;
IdFTP.Free;

DeleteFile('cache\main\'+namephoto) ;
end;

Это всё продолжение программы http://programmersforum.ru/showthread.php?t=142029 и http://programmersforum.ru/showthread.php?t=147062

Этот античит работает уже 3й день, логи отлично отлавливают на предмет запущенных читов, а вот скрины только с ХР приходят нормальные, а на вин7 чёрные полностью. Программа работает по таймеру.

Последний раз редактировалось _KUL; 30.04.2011 в 11:03.
_KUL вне форума Ответить с цитированием
Старый 30.04.2011, 13:53   #10
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

А на компьютере с которого отправляли, скрины сохраняются тоже черные?
eduard93 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать сеть в простенькой игре??? Руслантус Gamedev - cоздание игр: Unity, OpenGL, DirectX 16 21.05.2010 20:44
НУЖЕН...Автоматический Print Screen! DatonHhod Общие вопросы .NET 5 12.05.2010 18:01
Print Screen на КПК? Snoopy Свободное общение 6 08.04.2010 14:35
Print Screen Maxs Общие вопросы C/C++ 5 12.04.2009 13:57
Помогите сделать сохранения в игре!!! Teen4jump Gamedev - cоздание игр: Unity, OpenGL, DirectX 12 20.06.2007 17:29