Aew galera... vi que a maioria aqui programa com TibiaAPI e VB... entao, resolvi criar uns tutoriais pra ver se a galera se motiva a programar em Delphi, SEM usar a API.
Vo dar um exemplo SIMPLES de como ler um valor numeral (life do char por exemplo)... e como converter ele pra uma string ( converter é uma função muito simples do proprio delphi ;/ ).
Para seguir esse tutorial, é necessário ter noção básica de delphi, e obviamente, ter o delphi... não darei muitas explicações sobre "onde por o codigo" e sim "onde podemos usá-lo"... Antes de postar algo, por favor, leia o tópico todo (mesmo se nao entender algo...) para uma melhor avaliação x.X.. No final do tuto teremos o codigo completo (caso haja duvidas)...
Vamos lá:
ReadProcessMemory
É uma função capaz de ler memoria (ahh váa), vo explicar os parametros dela (não muito explicado... kkkk, só o bastante pra entenderem como usar), e dar um exemplo.
Entãao... hora de programar \o/
Crie um novo projeto no delphi... nele adicione uma label (aba standard) e um timer (aba system)...
Antes de começar a editar os componentes e suas ações, vamos inserir essas variaveis globais:
PH : THandle;
PID, ThID: DWORD;
H : THandle;
Vamos mudar a propriedade Name da label para Vida, e deixaremos o enabled do Timer em True e o Interval em 10 (não "muito rápido", mas, o essencial para o programa de exemplo funcionar...)
Agora, abaixo do Implementation... colocaremos esta função, pra ser mais pratico de se ler...
function LerInt(Address: Integer): Integer;
var
value:integer;
ler :dword;
begin
H := FindWindow(nil, 'Tibia');
ThID := GetWindowThreadProcessId(H, @PID);
PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);
ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler);
Result:=value;
end;
Dê dois clickes no timer, para ir ao evento do OnTimer dele... e insira o seguinte código:
vida.caption := 'Vida: '+IntToStr(Lerint($0063FD5C));
Execute (apertando F9), com o tibia aberto... (ou abra o tibia depois...sei lá), e veja a leitura acontecendo \o/
Agora sim vo explicar x.X
Declaramos variaveis globais para 'preencher' os parametros da leitura de memoria....
No código da função, começamos com a linha :
H := FindWindow(nil, 'Tibia');
A ideia é achar a janela do tibia, e dar esse 'valor' pra uma variavel Handle... que é para o primeiro paremetro da função de readprocessmemory.
Podemos achar a janela pela classe ou pelo titulo (caption, ou texto da janela... se preferirem), por exemplo:
se eu usar:
H := FindWindow('Tibiaclient', nil); // classe da janela do tibia
nesse caso, é a mesma coisa de usar:
H := FindWindow(nil, 'Tibia'); //nome da janela do tibia
Nessa parte do códigos, definimos que temos acesso total ao programa ( o tibia )...
PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);
E finalizando, temos a leitura... Usando o PH que é uma handle com acesso aos address do tibia, o address a ser lido, o retorno do valor, usando 4 bytes, e lendo com uma variavel dword... ( se não entendeu... siga a minha escrita e as cores, e vc entende... )
ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler);
E temos o resultado:
Result:=value;
Analisando a função minha, temos isso:
function LerInt(Address: Integer): Integer;
Ou seja, LerInt(Address) retornando valor integer...
Assim nosso timer atualiza o valor, com o seguinte código:
vida.caption := 'Vida: '+IntToStr(Lerint($0063FD5C)); // address de vida do tibia 8.7 (se meu address não estiver errado ;P)
Ou seja, nossa label chamada vida, tem sua propriedade caption alterada para o valor lido... mas, o valor é Integer, e a caption aceita String, então convertemos usando a função IntToStr ... ( integer Para String ;/ )....
Bom, é isso galera, acredito que muitos conhecem o ReadProcessMemory, só tentei explicar um pouco o que sei sobre a função =]
Se alguém teve duvida de aonde colocar cada code...No final, teremos um código mais ou menos assim:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
vida: TLabel;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
PH : THandle;
PID, ThID: DWORD;
H : THandle;
implementation
function LerInt(Address: Integer): Integer;
var
value:integer;
ler :dword;
begin
H := FindWindow(nil, 'Tibia');
ThID := GetWindowThreadProcessId(H, @PID);
PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);
ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler);
Result:=value;
end;
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
vida.caption := 'Vida: '+IntToStr(Lerint($0063FD5C));
end;
end.
OBS: o code é baseado naquele classico código da internet (tem em todos foruns quase X.X )... de ler e editar pontos no pinball do windows (mas, somente a parte de leitura)..., porém fiz algumas modifcações e transformei ele em uma função...
flw, abraços....
Qualquer duvida, sugestão ou correção... podem falar =]