Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.066 c
11-1217589019
rainstuff
2008-08-01 15:10
2010.08.27
Время и дата - некорректно отображение


2-1273732227
Василь
2010-05-13 10:30
2010.08.27
Организовать работу циклов и условий в редакторе блок-схем


15-1264835850
TUser
2010-01-30 10:17
2010.08.27
"экономика"


2-1270520076
Delphist2
2010-04-06 06:14
2010.08.27
как отменить выполнение обработчика?


15-1265798145
И. Павел
2010-02-10 13:35
2010.08.27
Смена базы данных.(2)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский