(Giga), есть функция FindWindow, которая постарается найти окно с нужным заголовком или классом.
Класс окна - это тоже что-то типа имени, как в заголовке.
Так что ищем окно игры и меняем его заголовок. А для этого потребуется функция SetWindowText.
Где можно посмотреть все эти функции? Думаю это есть в программе, но хотелось бы с примерами. Может быть есть какой-то сайт, где описаны все функции?!
Добавлено через 46 минут
Цитата:
Сообщение от BritishColonist
(Giga), есть функция FindWindow, которая постарается найти окно с нужным заголовком или классом.
Класс окна - это тоже что-то типа имени, как в заголовке.
Так что ищем окно игры и меняем его заголовок. А для этого потребуется функция SetWindowText.
Миссия выполнена VT почему-то ужасно грязный.
Если хотите посмотреть, что я сделала: [Ссылки могут видеть только зарегистрированные пользователи. ] | [Ссылки могут видеть только зарегистрированные пользователи. ]
Код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
if FindWindow(nil, 'Perfect World') = 0 then
ShowMessage('Окно не найдено.')
else
SetWindowText(FindWindow(nil, 'Perfect World'), 'by (Giga)');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if FindWindow(nil, 'by (Giga)') = 0 then
ShowMessage('Возможно вы ещё не переименовали клиент.')
else
SetWindowText(FindWindow(nil, 'by (Giga)'), 'Perfect World');
end;
end.
Последний раз редактировалось (Giga); 28.04.2012 в 11:08.
Причина: Добавлено сообщение
(Giga), а Вам и не нужны все функции WinAPI. Их очень-очень много.
Я же говорю, ставим цель - гуглим тему, ищем функции для этого. Вот и всё.
Надо переименовать окно - гуглим "переименовать окно delphi". Там и функции будут и темы на различных форумах и т.д.
Попробуйте теперь работать с памятью процесса игры.
Как известно, функция FindWindow возвращает значение типа HWND. HWND окна это его хендл или дескриптор (можно сказать, некий идентификатор окна). Если FindWindow возвращает nil (или 0, точно не помню), то окно не было найдено. Ну так вот, зная хендл окна, можно получить идентификатор процесса (он имеет целый беззнаковый тип, то есть значения от нуля и больше, 4 байта - тип DWORD).
Код:
var
pId: DWORD;
.. // остальные переменные
begin
.. // тут поиск окна
GetWindowThreadProcessId(WindowHandle, @pId);
if (pId > 0) then // если успешно получили pId
begin
.. // тут работаем с идентификатором процесса
end;
end;
Что можно сделать с pId? Используя функцию OpenProcess, можно открыть хендл процесса для работы с его памятью. После открытия хендла процесса можно использовать функции ReadProcessMemory и WriteProcessMemory, а так же прочие подобные функции (например, VirtualAllocEx). По окончании работы с памятью процесса его хендл должен быть закрыт через функцию CloseHandle.
Дерзайте и делитесь успехами.
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
Решила действительно попробовать поработать с процессом PW. Результаты так-себе. Помогите найти ошибку. Хочу выводить в форму текущий показатель ХП. Однако ничего не выводит. Вот код:
P.S. Из сообщений в теме выше, вы можете понять, что я неопытна. Могут быть нелепые ошибки
P.S.S. Сама нашла пару ошибок. В коде исправила, ничего не работает*(
Последний раз редактировалось (Giga); 28.04.2012 в 14:20.
(Giga), блок try и except я бы убрал. В этом нет особого смысла.
HP и MP должны быть тоже типа DWORD, но это не критично на самом деле.
А тут Вы читаете результат в переменную WHP, но MP делаете равным WMP.
Не в этом ли ошибки?
Эту ошибку я забыла исправить тут, в моем коде ошибки данной не было. И я сделала это. Вот мое изобретение:
[Ссылки могут видеть только зарегистрированные пользователи. ] | [Ссылки могут видеть только зарегистрированные пользователи. ] Код:
Что значит float?(знаю про неё в CE, но на что показывает в плане кодинга не понимаю). Так-же мне интересно, что значит "Повтор"?
3) Что значит "Идентификатор объекта"?
Последний раз редактировалось (Giga); 28.04.2012 в 17:51.
Причина: Добавлено сообщение
Попыталась дописать координаты, ничего не получилось. Выводит далеко не координаты
Это потому что координаты внутри процесса выглядят немного не в том виде, как показаны игроку.
Функции преобразования координат процесса в игровые(на с++)
Что значит float?(знаю про неё в CE, но на что показывает в плане кодинга не понимаю). Так-же мне интересно, что значит "Повтор"?
3) Что значит "Идентификатор объекта"?
Float - тип данных с плавающей(float) точкой, то-есть дробные числа, например 13.234. В памяти занимает 4 байта.
"Повтор" тут видимо автор сказал о том, что по данным адресам координаты дублируются повторно, если не ошибаюсь
Идентификатор объекта - это число типа DWORD который уникальный для каждого персонажа, лута, реса, игрока, вобщем всех обьектов. сделанно это для того, чтобы программа по ID (идентификатор) могла выбрать(идентифицыровать) только один обьект из множества одинаковых (мобы например), и никакой другой обьект не имеет такой же WID)
WID - World ID тоесть мировой идентификатор, то о чём я говорил. Есть ещё просто ID. Например ID типа вещи, ID npc'а, но в основном используется уникальный мировой идентификатор WID
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
Последний раз редактировалось dwa83; 28.04.2012 в 18:48.
Причина: Добавлено сообщение
Это функции преобразования координат в клиенте в привычные игроку, показанные на миникарте. Вставляются куда душе угодно, лишь бы были видны в программе. Это для с++, в делфи вместо фигурных скобок begin, end. Я для компактности так записал, можно и так
float GameX(float px)
{
return (px+4000)/10;
}
float GameY(float py)
{
return (py+5500)/10;
}
float GameZ(float pz)
{
return pz/10;
}
Добавлено через 7 минут
Цитата:
Сообщение от (Giga)
1) Как вывести например хп моего персонажа в форму Label?
Как я понимаю HP уже считанно в переменную. Дальше можно разместить на форме таймер, поставить интервал времени для него например 200мс. В обработке события таймера написать Label1.Caption:=IntToStr(HP); или просто Label1.Caption=HP; (должно само преобразоваться в string)
Ведь это основы..
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
Последний раз редактировалось dwa83; 29.04.2012 в 10:17.
Причина: Добавлено сообщение
Это функции преобразования координат в клиенте в привычные игроку, показанные на миникарте. Вставляются куда душе угодно, лишь бы были видны в программе. Это для с++, в делфи вместо фигурных скобок begin, end. Я для компактности так записал, можно и так
float GameX(float px)
{
return (px+4000)/10;
}
float GameY(float py)
{
return (py+5500)/10;
}
float GameZ(float pz)
{
return pz/10;
}
Все-равно не поняла... Можно пример кода Delphi для преобразования координат в нормальный вид?
эм... Это уже похоже на Delphi, но ничего не работает... Просьба, объясните, зачем вы прибавляете 5500 и делите на 10 координаты Y? Что значит переменная LocY\X\Z?
так как у нас LocX получаемая из памяти примерно равна ~2.546232532...
выполняем с действие FloatToStr((LocX + 4000) / 10)
получаем что то типа 245,43223232432...
выполняем с действие Copy(CX, 1, Pos(',', CX) - 1);
т.е. копирование строки до ","
и получаем 245
________________
если я не ошибаюсь, а могу и ошибаться ...
too many actual parameters