Главная страница
    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.48 MB
Время: 0.068 c
15-1269520791
Sergey13
2010-03-25 15:39
2010.08.27
Lazarus & FireBird


2-1269648248
HF-Trade
2010-03-27 03:04
2010.08.27
IDHttp.Post Проблема с залогиниванием


2-1272391252
romario
2010-04-27 22:00
2010.08.27
Сохранение файла на диск


4-1234979528
Skyhawk
2009-02-18 20:52
2010.08.27
Изменение цвета строки в TListView


2-1272781981
ixen
2010-05-02 10:33
2010.08.27
Как отобразить дату по маске в Dblookupcombobox?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский