Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.12.249] |
|
Сообщ.
#1
,
|
|
|
Возникла такая проблема - необходимо снимать скриншоты из игры с определённым промежутком и сохранять их в файл. Хочу кое-что отследить.
Собственно, помнится раньше я нашёл какой-то метод, если не ошибаюсь, с использованием WM_PRINT или WM_PAINT, который позволял делать скриншоты из неактивного окна почти любых 3д-игр, запущенных в оконном режиме. При этом этот-же метод делал чёрные квадраты вместо скриншотов, если подсунуть ему хэндл обычной программ, которые используют обычные формы/контроли для отрисовки окна. А сейчас у меня вплоть до наоборот - с обычных виндосовских форм могу снять скриншот, а с игры - нет. ScreenShot: TBitmap; function WindowSnap(windowHandle: HWND): boolean; var r: TRect; user32DLLHandle: THandle; printWindowAPI:function(sourceHandle: HWND; destinationHandle: HDC; nFlags: UINT): BOOL; stdcall; begin result:=False; user32DLLHandle:=GetModuleHandle(user32); if user32DLLHandle <> 0 then begin @printWindowAPI:=GetProcAddress(user32DLLHandle, 'PrintWindow'); if @printWindowAPI <> nil then begin GetWindowRect(windowHandle, r); ScreenShot.Width:=r.Right - r.Left; ScreenShot.Height:=r.Bottom - r.Top; ScreenShot.Canvas.Lock; try result:= printWindowAPI(windowHandle, ScreenShot.Canvas.Handle, 0); //SendMessage(windowHandle, WM_PRINT, Screenshot.Canvas.Handle, 0); finally ScreenShot.Canvas.Unlock; end; end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin //MakeScreenShot(HandleList[form1.ComboBox1.ItemIndex]) ; WindowSnap(HandleList[form1.ComboBox1.ItemIndex]); form2.Show; form2.Image1.Picture.Assign(ScreenShot); end; |
Сообщ.
#2
,
|
|
|
Млин, ну есть же спец. проги, которые это делают! Ты про google знаешь вообще?
|
Сообщ.
#3
,
|
|
|
Мне не нужны спец проги. Мне нужно реализовать это в своём приложении. Сейчас копаю в сторону GDI и BitBlt. Не могу разобраться с реализацией fromhbitmap.
|
Сообщ.
#4
,
|
|
|
Нет, BitBlt не смотря на все ухищрения с HDC ловит исключительно кусок экрана и мало чем по сути отличается от copyrect.
|
Сообщ.
#5
,
|
|
|
Проблема давно решена. Если кому интересно - в Win7 и в некоторых поздних версиях WinXP (которая видимо у меня до этого и стояла) изменена работа GDI - в связи с этим функция PrintWindow позволяет снимать скриншоты с любой программы, которая работает в оконном режиме.
|