Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
amakl
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
1

Как сделать скриншот, получая данные непосредственно из видеопамяти.

13.01.2011, 14:00. Просмотров 2761. Ответов 12
Метки нет (Все метки)

Я так предполагаю, нужно использовать asm вставки. Искал в сети исходники, но так и не нашел.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2011, 14:00
Ответы с готовыми решениями:

Как сделать скриншот региона экрана
Как сделать скриншот регоина экрана??? Я пыталься сделать так: procedure...

Как сделать скриншот игры минуя квадрат Малевича?
Народ нужно делать скрины игры, стандартный Bitblt возвращает квадрат Малевича....

Как сделать скриншот нужных мне координат в webbrowser?
Здравствуйте формчани) Прошу помощи, так как уже 2 дня не могу понять как...

Сделать скриншот свернутого приложения
Фрапс умеет такое делать.. Как бы мне делфи такому научить??? В сети есть...

Сделать скриншот экрана / копировать экранную область видеопамяти
Доброго времени суток. Для работы программы необходимо получить копию(скриншот)...

12
Voland_
1656 / 1002 / 96
Регистрация: 04.01.2010
Сообщений: 3,328
13.01.2011, 14:12 2
amakl, встречный вопрос: а что вы хотите взять из видеопамяти? Экран захватить?
0
amakl
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
13.01.2011, 14:17  [ТС] 3
Цитата Сообщение от Voland_ Посмотреть сообщение
amakl, встречный вопрос: а что вы хотите взять из видеопамяти? Экран захватить?
Нужно сделать копию экрана, и записать ее в bmp-файл.
0
Voland_
1656 / 1002 / 96
Регистрация: 04.01.2010
Сообщений: 3,328
13.01.2011, 16:29 4
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function CreateScreenshot: TBitmap;
var
 dw: HWND;
 dc: HDC;
begin
 Result := TBitmap.Create;
 Result.Width := Screen.Width;
 Result.Height := Screen.Height;
 dw := GetDesktopWindow;
 dc := GetDC(dw);
 BitBlt(Result.Canvas.Handle, 0, 0, Result.Width, Result.Height,
   dc, 0, 0, SRCCOPY);
 ReleaseDC(dw, dc);
 Result.SaveToFile('c:\111.bmp');
end;
0
amakl
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
13.01.2011, 22:19  [ТС] 5
Мне надо обойтись без GetDC, читать непосредственно из видеопамяти.
0
Voland_
1656 / 1002 / 96
Регистрация: 04.01.2010
Сообщений: 3,328
14.01.2011, 11:56 6
http://www.programmersheaven.com/mb/...-to-video-ram/

So, hope this helps . Кратко о чем там: народ обсуждает как это может быть реализовано и почему этого нельзя сделать под Windows NT.
0
FreeLancer93
33 / 33 / 4
Регистрация: 18.01.2011
Сообщений: 62
18.01.2011, 15:34 7
Если бы ты мог обойтись без GetDC(), то ты бы мог сделать прогу, делающую скрины весьма беспалевно от антивирусника.
Не думаю что именно в Delphi можно обойтись без GetDC. На Си, возможно, как нибудь хитроделанно это возможно сделать.
0
amakl
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
19.01.2011, 03:00  [ТС] 8
В дельфи есть всторенный ассемблер, на нем, возможно, и надо делать. Видел в интернете код на ассемблере, который пишет непосредственно в видеопамять, а вот считывания из видеопамяти не нашел.
0
Voland_
1656 / 1002 / 96
Регистрация: 04.01.2010
Сообщений: 3,328
19.01.2011, 11:15 9
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function getport(p:word):byte; stdcall;
begin
  asm
    push edx
    push eax
    mov  dx,p
    in   al,dx
    mov  @result,al
    pop  eax
    pop  edx
  end;
end;
 
 
 
Procedure Setport(p:word;b:byte);Stdcall;
begin
  asm
    push edx
    push eax
    mov dx,p
    mov al,b
    out dx,al
    pop  eax
    pop  edx
  end;
end;
Попробуйте, может, это вам подойдет?

ЗЫ: пример разработан под Win95, однако из под WinNT он по идее должен работать, если установить драйвер DLportIO (можно найти в инете)...
hope this helps...
Видеоданные начинаются с порта A000, судя по описанию, соответственно, в/из этих портов нужно писать/читать.
0
amakl
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
19.01.2011, 23:31  [ТС] 10
Спасибо, за помощь. Getport - это, видимо, функция открытия порта. Может подскажете, как ей пользоваться? Что за параметр p. Как с помощью этой функции прочитать весь экран?
P.S. Опыт работы с ассемблером отсутствует.
0
Voland_
1656 / 1002 / 96
Регистрация: 04.01.2010
Сообщений: 3,328
20.01.2011, 00:31 11
amakl, примерно так:

Delphi
1
2
3
4
5
6
7
8
var
  a : array of word;
  i : integer;
begin
  SetLength(a, 16); // Формируем массив из 16 значений по 16 бит
  for i:=0 to 15 do 
    a[i] := getport($A000+i*2)*$100 + getport($A000+i*2+1); // забираем 16битный цвет из памяти видеокарты
...
Сложно сказать, будет ли это работать, но попробовать стОит...
PS: не забудьте про DLportIO. Без него ничего работать не будет по WinXP и иже с ней.
0
amakl
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
20.01.2011, 20:55  [ТС] 12
Voland_, попробывал ваш пример, к сожалению не получается. Вылезает исключение
"Privileged instruction". Видимо система запрещает программе напрямую общаться с портом.
Установка DLportIO не помогла - появляется такое же исключение.
0
Voland_
1656 / 1002 / 96
Регистрация: 04.01.2010
Сообщений: 3,328
21.01.2011, 14:35 13
amakl, ну тогда вам поможет только Win'95/98. DLportIO помогает в работе с устройствами, которые раньше использовались в пром.санциях и вставлялись в ISA/PCI. Работа с ними и осуществлялась через порты. Вот там-то он и работал. А тут Винда, наверное, рубит все возможное и невозможное. Либо просто неправильно выбран адрес порта. Например, попробуйте вообще почитать порты, замените $A000 на что-нить другое, $8000, 0 и др.

ЗЫ: писать в "любые" порты сильно не рекомендую, если это получится сделать, то вы сможете где-то чего лишнего поломать, причем, физически. Один знакомый таким образом доломал плохо работающий CD-привод в свое время. Иначе нельзя было доказать продавцам, что его надо менять по гарантии.
0
21.01.2011, 14:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2011, 14:35

Мап видеопамяти или скриншот из r0
Вроде тема избита, но чтот не выходит. HLP. Через IOCTL -...

Как передать данные из массива непосредственно в диаграмму, минуя сводную таблицу?
Эти строчки передают данные по Х и У из диапазонов В7:Н7, В8:Н8 и затем на их...

Как сделать скриншот программы
Здравствуйте проблема такая надо сделать скриншоты в турбо паскале но не какие...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru