Postado Janeiro 22, 2011 14 anos 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 =] Tutoriais de Programação com Delphi sem TibiaAPI: ReadProcessMemory - Lendo Valores de memoria sem TibiaAPI Função de Hotkey (Simula pressionamento de hotkeys no tibia) Função Say para o Tibia (Sem TibiaAPI)
Postado Janeiro 22, 2011 14 anos Pra quem quer realmente aprender, aconselho estudar as funções que ele usa e também a função que ele criou LerInt, é possivel fazer varias alterações dependendo do objetivo da pessoa. O tutorial está muito bem explicado e de fácil entendimento. REP+ "A esperança é o sonho do homem acordado." Aristóteles
Postado Janeiro 23, 2011 14 anos Dragon, muito bom o tuto, gostei bastante, tem muita coisa que eu não intendi (ainda), mais ficou bacana! REP+ # Regras Gerais - TibiaKing.com # Contato: [email protected]Não respondo dúvidas via MP.
Postado Janeiro 26, 2011 14 anos Delphi é muito bom. Fico impressionado quando o puncker me manda os programas que ele faz no delphi em questão de hora. Vou ver se me interesso e baixo (de novo) o delphi pra mexer e.e' Rep+ rena.to
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.