PDA

Просмотр полной версии : Вывод текста в игре (DirectX)


carliker
27.01.2011, 15:34
Есть игра, которая использует DirectX, например Dirt 2. Необходимо сделать программу которая будет выводить какой либо текст (например слово "Привет") в игре при нажатии на горячую кнопку.

Помогите написать такую программу на Delphi.
Есть пример http://tracker2k.kiev.ua/5.html

Но он по каким то причинам не работает.

n1ghtmare
27.01.2011, 15:46
Собираешь длл, пихаешь её в нужный процесс (до создания D3D интерфейса, т.к. в примере объект интерфейса берется из хукнутой функции инициализации).
Далее хукаешь EndScene и рисуешь в нем что тебе нужно... Хз что может быть проще хука D3D, по этой теме в инете инфы больше всего.

Вопрос нужно ставить конкретнее... Что не работает, где не работает.

Может ты длл слишком поздно инжектиш? Тогда конечно работать не будет т.к. интерфейса для работы с D3D ты не получишь. Инжектить надо сразу при создании процесса.

carliker
27.01.2011, 16:36
Алгоритм работы я понял. Библиотека вроде инжектируется, но ничего не работает (нет надписи). Общался с человеком который писал ту статью. Он предположил что это из-за того что у меня Windows 7. Типо хук не срабатывает. Может можно как то вместо madCHook использовать другой хук?

n1ghtmare
27.01.2011, 17:32
Никогда не юзаю подобные либы для хука. Имхо лучше руками написать свой хук. Хукай к примеру спайсингом.

carliker
27.01.2011, 18:07
Спасибо конечно за совет, но к сожалению я понятия не имею что это такое. Не могли бы вы дать какой нибудь пример? Буду очень признателен

n1ghtmare
27.01.2011, 19:11
Могу дать на плюсах, на делфи не пишу.

Да и вообще ищи на этом формуе, здесь ест пример хука. Также google.com в помощь. Инфы про хуки в инете как гарязи, правда хз сколько из этой инфы на делфи.

carliker
31.01.2011, 11:03
Инфы дофига, да вот только она одна и таже везде. Мне бы что-нибудь типо примера на который я давал ссылку. Вроде все просто, но вот не рпботает почему то...

n1ghtmare
31.01.2011, 14:44
Если дело в том хуке который ты юзаеш, то ты об этом врятли узнаешь. Если написать свой хук то во первых будет больше понимания происходящего, во вторых ошибки будет найти намного легче.

ЗЫ: ты хоть меседжбоксы из хукнутых функций пытался вызывать?

Morfik
31.01.2011, 15:34
на делфях для ло2 - но думаю покатит для любой ДХ игры
http://coderx.ru/showpost.php?p=114436&postcount=19

mira
02.02.2011, 01:16
на 7 все также

carliker
07.02.2011, 13:34
Morfik, спасибо за библиотеку, но как ее использовать. Может ты можешь дать код для ее инжектирования.

Morfik
07.02.2011, 13:36
5-я ссылка в гугле http://www.xakep.ru/post/26796/default.asp

MadBorZ
07.02.2011, 16:16
Только не вздумай юзать это на руоффе ло2!

carliker
08.02.2011, 16:51
Morfik, у меня не работает не с одной из игр. Можешь дать 100% рабочий текст?

Morfik
08.02.2011, 21:18
Morfik, у меня не работает не с одной из игр. Можешь дать 100% рабочий текст?

проверил на втором масс эффекте, в дллке надо дописывать в какие приложениях ей работать

begin
if GetModuleHandle(nil)=GetModuleHandle('MassEffect2. exe') then
begin
dx.HookDX;
end;
end.

carliker
09.02.2011, 13:37
Morfik, огромное спасибо!!!! Все работает!
Теперь вопрос в догонку, а как этот текст можно менять при нажатии на горячии кнопки (как отлавливать их нажатие я знаю). Как сам текст менять?

Morfik
09.02.2011, 13:55
Morfik, огромное спасибо!!!! Все работает!
Теперь вопрос в догонку, а как этот текст можно менять при нажатии на горячии кнопки (как отлавливать их нажатие я знаю). Как сам текст менять?

g_Font.DrawTextA(nil,PChar('Привет мир'),-1, @TextRect,DT_LEFT or DT_NOCLIP,D3DCOLOR_RGBA($ff, $00, $00, $ff));

ну дак вместо 'Привет мир' пихаеш туда переменную типа string а своими горячими клавишами меняеш ей значение

carliker
09.02.2011, 14:12
а куда вставлять цикл который будет обрабатывать горячии клавиши? В ехе или в длл

Добавлено через 7 минут
Я обычно на форму кидал таймер и вот так писла:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if getasynckeystate($70)<>0 then
begin
//действие
end;
end;

Morfik
09.02.2011, 14:13
а куда вставлять цикл который будет обрабатывать горячии клавиши? В ехе или в длл

Добавлено через 7 минут
Я обычно на форму кидал таймер и вот так писла:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if getasynckeystate($70)<>0 then
begin
//действие
end;
end;

exe это всего лиш метод инжекта, все дейтсвия происходят в процессе игры, а длл именно там - значит все именно там

carliker
09.02.2011, 14:23
Блин, мне реально уже стыдно спрашивать, извините за мою тупость, но где в библиотеки написать процедуру отлова клавишь и как. С формой то все понятно, там событие по таймеры происхдило. А тут когда оно должно происходить?

Все для горячей клавиши дошло как сделать:
if getasynckeystate($70)<>0 then
begin
TextRect := Rect(300,300,300,300);
g_Font.DrawTextA(nil,PChar('Работает'),-1, @TextRect,DT_LEFT or DT_NOCLIP,D3DCOLOR_RGBA($ff, $00, $00, $ff));
Result:=EndScene9Next(self);
end
else
begin
TextRect := Rect(300,300,300,300);
g_Font.DrawTextA(nil,PChar('Привет мир'),-1, @TextRect,DT_LEFT or DT_NOCLIP,D3DCOLOR_RGBA($ff, $00, $00, $ff));
Result:=EndScene9Next(self);
end;

А как сделать чтобы бралось слово из Edit который на форме, например:
g_Font.DrawTextA(nil,PChar(Edit1.Text),-1, @TextRect,DT_LEFT or DT_NOCLIP,D3DCOLOR_RGBA($ff, $00, $00, $ff));

и второй вопрос, можно ли вместе с текстом вывести картинку маленькую или хотя бы фон у текста сделать например черным?
Спасибо

Morfik
09.02.2011, 16:32
carliker, ну во первых Form1.Edit1.Text и эта форма должна быть в длл
и второй вопрос, можно ли вместе с текстом вывести картинку маленькую или хотя бы фон у текста сделать например черным?
можно все что угодно, учим directx

carliker
09.02.2011, 21:00
Чето у меня не получается.
в dx.pas добавил uses Unit1;
строку вывода текста изменил:
text:=Form1.Edit1.Text;
TextRect := Rect(300,300,300,300);
g_Font.DrawTextA(nil,PChar(text),-1, @TextRect,DT_LEFT or DT_NOCLIP,D3DCOLOR_RGBA($ff, $00, $00, $ff));
сверху в var написал text:string;
Все компилируется, но когда игру запускаю вылазиет ошибка. Если просто текст пишу то все нормально

Хотелось бы сделать так чтобы из ехе с главной формы из Edit брались данные, и писались в переменную в библиотеки.

ПОмогите плиз, осталось то совсем чуть чуть!!!!

carliker
11.02.2011, 08:42
Ну неужели никто не знает ответа?

mira
16.02.2011, 11:03
учи shared memory в длл и будет те счастье

Enhiridion
16.02.2011, 12:38
Можно юзать GDI + double или даже triple buffer для устранения мерцания.