Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Как получить кусок картинки из чужого приложения?   Найти похожие ветки 

 
duMka ©   (2010-01-31 12:49) [0]

Имеется 3D игрушка, например PerfectWorld. Хочется небольшую программку, чтобы персонаж пил зелья, если его здоровье\мана меньше определенного уровня. Собственно для этого требуется получить полоску состояния здоровья в Canvas, для анализа. Как это правильно сделать?


 
@!!ex ©   (2010-01-31 13:00) [1]

GetDC(0)
BitBlt
ReleaseDC


 
Вася   (2010-01-31 16:15) [2]

на DX так не сработает...там надо в прогу влезать и ставить хуки на вызовы каких-то DX функций...
сам не умею, просто читал что только так получится...попробуйте поискать по словам "оверлеи DirectX".


 
@!!ex ©   (2010-01-31 16:19) [3]

> [2] Вася   (31.01.10 16:15)

С каких пор 3D игрушки стали через overlay работать?


 
Вася   (2010-01-31 16:24) [4]

ну у меня они никогда не скриншотятся.ни программно,ни принтскрином.
поэтому вероятно через overlay...


 
Eraser ©   (2010-01-31 16:31) [5]

плохо скриншотил )


 
Вася   (2010-01-31 16:39) [6]

наверное от игры зависит.про PerfectWorld не знаю, для него может и сойдёт...
а зачем же тогда эти overlay вообще,если не для игр?и через что тогда игры рисуют?=\\


 
antonn ©   (2010-01-31 16:49) [7]

автор делает бота? :)
PW - это мморпг


 
Anatoly Podgoretsky ©   (2010-01-31 17:16) [8]

> antonn  (31.01.2010 16:49:07)  [7]

Полиморфа


 
@!!ex ©   (2010-01-31 19:16) [9]

> [6] Вася   (31.01.10 16:39)
> а зачем же тогда эти overlay вообще,если не для игр?и через
> что тогда игры рисуют?=\\

Для видео. и только.


 
duMka ©   (2010-01-31 19:50) [10]


> автор делает бота? :)

Что я хочу - описано в первом посте, бот для меня слишком круто, я в программировании практически 0. Я практчески ничего не понял, из того что посоветовали, тем не менее мне удалось написать такой кусок кода:

procedure TForm1.Button2Click(Sender: TObject);
var
HandleDC_Game: hDC;
begin
    HandleDC_Game:=GetDC(Handle_Game);
    BitBlt(Image1.Canvas.Handle,0,0,250,250,HandleDC_Game,300,300,SRCCOPY);
    ReleaseDC(Handle_Game,HandleDC_Game);
end;

По нажатию Button2 я действительно получаю кусок картинки из игры на Image1. Все последующие нажатия ничего не дают.

Вставил Image1.Canvas.Refresh; - то же самое.
Что еще не хватает? (кроме мозга:)


 
Вася   (2010-01-31 20:44) [11]

вот только не "Image1.Canvas.Refresh;",а "Image1.Repaint;".

и я бы посоветовал не юзать TImage - а оно нам надо?)
копируй в битмап:

var HDC_Game: hDC; Handle_Game: HWND; ScreenShot_Game: TBitmap;

...

//при включении программы
ScreenShot_Game:=TBitmap.Create;
ScreenShot_Game.PixelFormat:=pf24bit;
ScreenShot_Game.Height:=250;
ScreenShot_Game.Width:=250;
HDC_Game:=GetDC(Handle_Game);//если не меняется - то зачем постоянно создавать/уничтожать?

...

BitBlt(ScreenShot_Game.Canvas.Handle, 0, 0, 250, 250, HDC_Game, 300, 300, SRCCOPY);

...

//при закрытии программы
ReleaseDC(Handle_Game, HDC_Game);
ScreenShot_Game.Free;


 
duMka ©   (2010-01-31 21:58) [12]


> вот только не "Image1.Canvas.Refresh;",а "Image1.Repaint;
> ".

Да, спасибо за советы, так получается. (как многа я не знаю :().

Что по поводу Image, то взято лишь только для теста, посмотреть визуально как оно работает.

Работает здорово. Думаю, а не выводит ли туда увеличенное изображение вблизи игрока.... Полезно ИМХО. Как многа идей появляется по ходу, может я так и до бота созрею :)


 
Вася   (2010-01-31 23:02) [13]

тогда почитайте про функцию StretchBlt.=))


 
@!!ex ©   (2010-02-04 20:32) [14]

Так вот.... Приведенный здесь способ... не работает для 3D приложения на ОС с включенным Aero...
Все что на кэнвасе отображается отображается без проблем, а вот 3D получать нивкакую не хочет...
Может кто нибудь подсказать что делать??


 
duMka ©   (2010-02-10 20:12) [15]

StretchBlt супер :).

Истчо пару вопросов:

1. Хочу нарисовать что-то поверх окна игрушки. BitBlt в обратную сторону как я понимаю не прокатит? Т.е. скопировтаь-то получится, но игрушка это тут же закрасит. Нужно поверх окна игры расположить прозрачную форму и рисовать на ней, я правильно мыслю?

2. А как узнать размеры рабочей области окна, с которой я копирую скриншот?


 
Вася   (2010-02-10 22:56) [16]

в обратную сторону прокатит,так в основном и выводится всё...просто DX и OGL оч быстро обновляют картинку.я ж уже писал в [2]...
можно и формой попытаться, но как её двигать вместе с чужим окном?а полноэкранный режим как?

может GetClientRect?


 
@!!ex ©   (2010-02-10 23:57) [17]

> [15] duMka ©   (10.02.10 20:12)

Самый верный способ рендера в окно игры - внедрение и перехват контекста. Как делать не скажу, ибо раздолье для читера который гуглит в поисках этого метода.

Использовал тут:
http://sol-online.org/index.php?content=info&project=tactics



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.047 c
15-1269977724
Anatoly Podgoretsky
2010-03-30 23:35
2010.08.27
Список пойманых фирм.


15-1267507011
Студент с горящими глазами
2010-03-02 08:16
2010.08.27
Вопрос по поводу вакансий


15-1273053437
'<>
2010-05-05 13:57
2010.08.27
Разложение числа на множители.


2-1275459989
novai
2010-06-02 10:26
2010.08.27
Не минимизация второй формы


15-1266711780
KilkennyCat
2010-02-21 03:23
2010.08.27
586b наглядно