 |
Delphi XE2 - Общение разработчиков - Программирование для Perfect World, общение и обсуждене разработок |
04.07.2012, 21:03
|
#1
|
|
|
|
Сержант
|
 Регистрация: 19.12.2009
 Сообщений: 130
 Популярность: 34
 Сказал(а) спасибо: 21
Поблагодарили 86 раз(а) в 32 сообщениях
|
Delphi XE2
Начал писать на делфи и сталкнулся с не понятной мне ситуацией. Сделал программу , которая находит имя перса и сует его в combobox . Но это происходит не понятно . Если запущенно 2 окна то находит только 1 окно . Причем каждый раз разное .
Вот код :
 |
Цитата: |
 |
|
|
|
|
|
|
|
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm2 = class(TForm)
ComboBox1: TComboBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
FID: array[0..10] of THandle;
implementation
{$R *.dfm}
function ReadPlayerName(hProcess,data:DWord): string;
var
i,rw:size_t;
ch:WideChar;
PID,PID1:DWord;
wch:array[0..255] of WideChar;
str:string;
begin
i:=0;
repeat
ReadProcessMemory(hProcess,ptr(data),@ch,2,rw);
data:=data+2;
wch[i]:=ch;
inc(i);
until
(ord(ch)=0) or (i>=255);
i:=0;
str:='';
repeat
str:=str+wch[i];
inc(i);
until
wch[i]='';
result:=str;
end;
procedure TForm2.Button1Click(Sender: TObject);
var
Wnd:THandle;
Nick,Res:String;
Hndl:array[0..255] of Char;
buf,ibuf,BC:size_t;
hProcess,PID,PID1:size_t;
i:Integer;
const
BA=$00B27A04;
begin
combobox1.Items.Clear;
Wnd:=FindWindow('elementclient Window',nil);
GetWindowThreadProcessId(Wnd,@PID);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,PID );
i:=0;
while (hProcess<>0) and (PID<>PID1) do
begin
GetWindowText(Wnd,Hndl,SizeOf(Hndl));
ReadProcessMemory(hProcess,ptr(BA),@ibuf,sizeof(ib uf),BC);
ReadProcessMemory(hProcess,ptr(ibuf+$1C),@ibuf,siz eof(ibuf),BC);
ReadProcessMemory(hProcess,ptr(ibuf+$34),@ibuf,siz eof(ibuf),BC);
ReadProcessMemory(hProcess,ptr(ibuf+$638),@buf,siz eof(buf),BC);
Nick:=ReadPlayerName(hProcess,buf);
Res:=Nick;
ComboBox1.Items.Add(Res);
FID[i]:=Wnd;
PID:=PID1;
inc(i);
end;
CloseHandle(hProcess);
end;
end. |
|
 |
|
 |
|
P.S Еще 1 вопрос как сделать персонажа активным. Т.е , чтобы я его выбрал в combobox и все действия на отправку пакетов , сканирование инвентаря шли только к этому персу .
|
|
|
05.07.2012, 23:18
|
#2
|
|
|
|
Лейтенант-командор
|
 Регистрация: 12.08.2010
 Сообщений: 727
 Популярность: 30569
 Золото Zhyk.Ru: 1
 Сказал(а) спасибо: 57
Поблагодарили 645 раз(а) в 386 сообщениях
|
Re: Delphi XE2
Тут был развёрнутый ответ на твой вопрос, но во время нажатия на кнопку отправки форум был недоступен и всё ушло в небытие. Переписывать заново желания нет.
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Perfect World: PWDatabaseScanner, Client, PWNickRenamer, PWClientRenamer, База логинов PW, Гайд по варУ, Зарабатываем репутацию.
Delphi: Авторизация на сайте с помощью Indy, Загрузка изображений с интернета в TImage с помощью Indy, Автоматическая смена стандартной версии Indy в Delphi на Indy 10.0.76 / 10.1.5, Основы парсинга с помощью Indy, Делаем Updater до программы с помощью Indy.
Other: ShowIP, FFUUU смайлы в QIP, Как играть в Minecraft (видеокурс), Как мы захватили человечество :D, Энергия в Лицемер/TopFace, PasGen.
|
|
|
05.07.2012, 23:55
|
#3
|
|
|
|
Разведчик
|
 Регистрация: 30.10.2009
 Сообщений: 7
 Популярность: 107
 Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
|
Re: Delphi XE2
|
|
|
06.07.2012, 00:17
|
#4
|
|
|
|
Лейтенант-командор
|
 Регистрация: 12.08.2010
 Сообщений: 727
 Популярность: 30569
 Золото Zhyk.Ru: 1
 Сказал(а) спасибо: 57
Поблагодарили 645 раз(а) в 386 сообщениях
|
Re: Delphi XE2
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Perfect World: PWDatabaseScanner, Client, PWNickRenamer, PWClientRenamer, База логинов PW, Гайд по варУ, Зарабатываем репутацию.
Delphi: Авторизация на сайте с помощью Indy, Загрузка изображений с интернета в TImage с помощью Indy, Автоматическая смена стандартной версии Indy в Delphi на Indy 10.0.76 / 10.1.5, Основы парсинга с помощью Indy, Делаем Updater до программы с помощью Indy.
Other: ShowIP, FFUUU смайлы в QIP, Как играть в Minecraft (видеокурс), Как мы захватили человечество :D, Энергия в Лицемер/TopFace, PasGen.
|
|
|
06.07.2012, 08:30
|
#5
|
|
|
|
Сержант
|
 Регистрация: 19.12.2009
 Сообщений: 130
 Популярность: 34
 Сказал(а) спасибо: 21
Поблагодарили 86 раз(а) в 32 сообщениях
|
Re: Delphi XE2
|
|
|
06.07.2012, 23:10
|
#6
|
|
|
|
Рыцарь-капитан
|
 Регистрация: 14.06.2012
 Сообщений: 511
 Популярность: 7566
 Сказал(а) спасибо: 4
Поблагодарили 181 раз(а) в 88 сообщениях
|
Re: Delphi XE2
|
|
|
07.07.2012, 00:33
|
#7
|
|
|
|
Лейтенант-командор
|
 Регистрация: 12.08.2010
 Сообщений: 727
 Популярность: 30569
 Золото Zhyk.Ru: 1
 Сказал(а) спасибо: 57
Поблагодарили 645 раз(а) в 386 сообщениях
|
Re: Delphi XE2
Хорошо, рискну повторить, только если форум обратно меня решит потроллить, то ответа от меня вам больше не видать
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
function ReadPlayerName(hProcess,data: DWord): string;
|
|
 |
|
 |
|
Во первых, функцию я написал для Delphi 7, которая не поддерживает Unicode string, в ХЕ2 достаточно тупо читать в string.
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
ReadProcessMemory(hProcess,ptr(ibuf+$638),@buf,siz eof(buf),BC);
|
|
 |
|
 |
|
На время написания этой функции версия клиента версия клиента была не той, что сейчас, адреса изменились, надо иногда смотреть, что делает код. перед тем как копипастить. Правильный оффсет для текущего руоффа - $66C
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
GetWindowText(Wnd,Hndl,SizeOf(Hndl));
|
|
 |
|
 |
|
Судя по коду, эта строка тебе не нужна, тупо удали её.
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
Wnd:=FindWindow('elementclient Window',nil);
|
|
 |
|
 |
|
Класс окна чувствителен в регистру, так что не стоило менять большую букву на маленькую.
P.S. Боюсь даже представить, что за программу вы напишете, если в таком простом коде разобраться не смогли...
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Perfect World: PWDatabaseScanner, Client, PWNickRenamer, PWClientRenamer, База логинов PW, Гайд по варУ, Зарабатываем репутацию.
Delphi: Авторизация на сайте с помощью Indy, Загрузка изображений с интернета в TImage с помощью Indy, Автоматическая смена стандартной версии Indy в Delphi на Indy 10.0.76 / 10.1.5, Основы парсинга с помощью Indy, Делаем Updater до программы с помощью Indy.
Other: ShowIP, FFUUU смайлы в QIP, Как играть в Minecraft (видеокурс), Как мы захватили человечество :D, Энергия в Лицемер/TopFace, PasGen.
|
|
|
07.07.2012, 10:39
|
#8
|
|
|
|
Рыцарь-капитан
|
 Регистрация: 14.06.2012
 Сообщений: 511
 Популярность: 7566
 Сказал(а) спасибо: 4
Поблагодарили 181 раз(а) в 88 сообщениях
|
Re: Delphi XE2
VeTaL_UA, так вроде бы в этом все и так понятно, это просто его небольшие недочеты. У меня все оффсеты и нормальные условия соблюдены, но находит только активное окно - то есть в которое заходил последний раз. сделал еще одну функцию поиска - такую же, но уже по названию окна, находит 2-ух персов меняет ники окон и все вообщем то нормально. но одно но. если окна будут с именем не Perfect World,а Element Client то врятли второе окно сможет найти
|
|
|
07.07.2012, 13:35
|
#9
|
|
|
|
Пехотинец
|
 Регистрация: 21.03.2012
 Сообщений: 83
 Популярность: 1178
 Сказал(а) спасибо: 18
Поблагодарили 101 раз(а) в 53 сообщениях
|
Re: Delphi XE2
Bот ещё пример поиска всех окон на borland с++, на делфи переделать не составит труда, все функции аналогичны.
А что-то в коде выше я не увидел перечисления окон.. он и находит одно окно
Код:
void FindClients()
{
char classname[256];
kolbot=0; //количество окон
DWORD pid; // ид процесса
Form1->ComboBox2->Items->Clear(); // Очистим список перед началом поисков
HWND Wd=FindWindow(0,0); // Найдем первое окно верхнего уровня любого класса
while (Wd!=0) // Если такое окно существует
{
GetClassName(Wd,classname,100); //считаем имя класса
AnsiString cn=classname; // тут всякие костыли
if (cn=="ElementClient Window") // если найденное окно - это окно пв
{
AnsiString wname = "Персонаж " + IntToStr(kolbot); // это для переименовывания
SetWindowText(Wd,wname.c_str()); //переименуем окно
Form1->ComboBox2->Items->Add(wname); //добавим к списку найденных
GetWindowThreadProcessId(Wd,&pid); //найдём пид по найденному окну
bot[kolbot].client.Init(pid); // тут всякая инициализация, или можно pid записать в массив, чтобы потом использовать приминительно к этому окну
bot[kolbot].client.wind=Wd; // запомним хэндл этого окна
kolbot++; // счётчик количества окон увеличим на 1
}
Application->ProcessMessages(); // Дадим возможность поработать другим событиям
Wd=GetNextWindow(Wd,GW_HWNDNEXT); // Найдем следующее окно в системе.
}
}
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
Последний раз редактировалось dwa83; 07.07.2012 в 13:46.
|
|
|
07.07.2012, 15:24
|
#10
|
|
|
|
Лейтенант-командор
|
 Регистрация: 12.08.2010
 Сообщений: 727
 Популярность: 30569
 Золото Zhyk.Ru: 1
 Сказал(а) спасибо: 57
Поблагодарили 645 раз(а) в 386 сообщениях
|
Re: Delphi XE2
Код:
var
FID:array[0..9] of DWord;
. . .
procedure FindClient;
var
Wnd:THandle;
Hndl,Nick:array[0..255] of Char;
ibuf,BC,hProcess,PID,PID1:size_t;
i:Integer;
const
BA=$00A571E0;
begin
Form1.Combobox1.Items.Clear;
i:=0;
while (hProcess<>0) and (PID<>FID[i]) do
begin
Wnd:=FindWindow('ElementClient Window',nil);
if Wnd=0 then
begin
Break;
end;
GetWindowText(Wnd,Hndl,SizeOf(Hndl));
GetWindowThreadProcessId(Wnd,@FID[i]);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,FID[i]);
ReadProcessMemory(hProcess,ptr(BA),@ibuf,sizeof(ibuf),BC);
ReadProcessMemory(hProcess,ptr(ibuf+$1C),@ibuf,sizeof(ibuf),BC);
ReadProcessMemory(hProcess,ptr(ibuf+$34),@ibuf,sizeof(ibuf),BC);
ReadProcessMemory(hProcess,ptr(ibuf+$66C),@ibuf,sizeof(ibuf),BC);
ReadProcessMemory(hProcess,ptr(ibuf),@Nick,sizeof(Nick),BC);
Form1.ComboBox1.Items.Add('Handle: '+Hndl+'; Nick: '+Nick+';');
PID:=FID[i];
inc(i);
end;
CloseHandle(hProcess);
end;
Этот код на 1.4.4. работал, как часы, сейчас только 1 окно находит.
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Perfect World: PWDatabaseScanner, Client, PWNickRenamer, PWClientRenamer, База логинов PW, Гайд по варУ, Зарабатываем репутацию.
Delphi: Авторизация на сайте с помощью Indy, Загрузка изображений с интернета в TImage с помощью Indy, Автоматическая смена стандартной версии Indy в Delphi на Indy 10.0.76 / 10.1.5, Основы парсинга с помощью Indy, Делаем Updater до программы с помощью Indy.
Other: ShowIP, FFUUU смайлы в QIP, Как играть в Minecraft (видеокурс), Как мы захватили человечество :D, Энергия в Лицемер/TopFace, PasGen.
|
|
|
07.07.2012, 15:53
|
#11
|
|
|
|
Рыцарь-капитан
|
 Регистрация: 14.06.2012
 Сообщений: 511
 Популярность: 7566
 Сказал(а) спасибо: 4
Поблагодарили 181 раз(а) в 88 сообщениях
|
Re: Delphi XE2
|
|
|
07.07.2012, 15:58
|
#12
|
|
|
|
Лейтенант-командор
|
 Регистрация: 12.08.2010
 Сообщений: 727
 Популярность: 30569
 Золото Zhyk.Ru: 1
 Сказал(а) спасибо: 57
Поблагодарили 645 раз(а) в 386 сообщениях
|
Re: Delphi XE2
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
как сделать чтобы 2 находил из этого?
|
|
 |
|
 |
|
менять алгоритм поиска. Перевёл код dwa83 на делфи, он рабочий:
Код:
var
FID:array[0..9] of DWord;
. . .
procedure FindClientPW;
var
Wnd:THandle;
Hndl,Nick,Cl:array[0..255] of Char;
ibuf,BC,hProcess:size_t;
i:Integer;
const
BA=$00A571E0;
begin
i:=0;
Wnd:=FindWindow(nil,nil);
while Wnd<>0 do
begin
GetClassName(Wnd,Cl,100);
if Cl='ElementClient Window' then
begin
GetWindowText(Wnd,Hndl,SizeOf(Hndl));
GetWindowThreadProcessId(Wnd,@FID[i]);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,FID[i]);
ReadProcessMemory(hProcess,ptr(BA),@ibuf,sizeof(ibuf),BC);
ReadProcessMemory(hProcess,ptr(ibuf+$1C),@ibuf,sizeof(ibuf),BC);
ReadProcessMemory(hProcess,ptr(ibuf+$34),@ibuf,sizeof(ibuf),BC);
ReadProcessMemory(hProcess,ptr(ibuf+$66C),@ibuf,sizeof(ibuf),BC);
ReadProcessMemory(hProcess,ptr(ibuf),@Nick,sizeof(Nick),BC);
Form1.ComboBox1.Items.Add('Handle: '+Hndl+'; Nick: '+Nick+';');
inc(i);
end;
Wnd:=GetNextWindow(Wnd,GW_HWNDNEXT);
Application.ProcessMessages;
end;
CloseHandle(hProcess);
end;
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Perfect World: PWDatabaseScanner, Client, PWNickRenamer, PWClientRenamer, База логинов PW, Гайд по варУ, Зарабатываем репутацию.
Delphi: Авторизация на сайте с помощью Indy, Загрузка изображений с интернета в TImage с помощью Indy, Автоматическая смена стандартной версии Indy в Delphi на Indy 10.0.76 / 10.1.5, Основы парсинга с помощью Indy, Делаем Updater до программы с помощью Indy.
Other: ShowIP, FFUUU смайлы в QIP, Как играть в Minecraft (видеокурс), Как мы захватили человечество :D, Энергия в Лицемер/TopFace, PasGen.
Последний раз редактировалось VeTaL_UA; 07.07.2012 в 17:00.
|
|
|
07.07.2012, 19:33
|
#13
|
|
|
|
Рыцарь-капитан
|
 Регистрация: 14.06.2012
 Сообщений: 511
 Популярность: 7566
 Сказал(а) спасибо: 4
Поблагодарили 181 раз(а) в 88 сообщениях
|
Re: Delphi XE2
VeTaL_UA, только что протестил, все работает. выражаю благодарность. а может ты знаешь как пакет в игру отправить7
Последний раз редактировалось Ginrey; 07.07.2012 в 19:38.
|
|
|
07.07.2012, 21:25
|
#14
|
|
|
|
Лейтенант-командор
|
 Регистрация: 12.08.2010
 Сообщений: 727
 Популярность: 30569
 Золото Zhyk.Ru: 1
 Сказал(а) спасибо: 57
Поблагодарили 645 раз(а) в 386 сообщениях
|
Re: Delphi XE2
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Perfect World: PWDatabaseScanner, Client, PWNickRenamer, PWClientRenamer, База логинов PW, Гайд по варУ, Зарабатываем репутацию.
Delphi: Авторизация на сайте с помощью Indy, Загрузка изображений с интернета в TImage с помощью Indy, Автоматическая смена стандартной версии Indy в Delphi на Indy 10.0.76 / 10.1.5, Основы парсинга с помощью Indy, Делаем Updater до программы с помощью Indy.
Other: ShowIP, FFUUU смайлы в QIP, Как играть в Minecraft (видеокурс), Как мы захватили человечество :D, Энергия в Лицемер/TopFace, PasGen.
|
|
|
07.07.2012, 22:19
|
#15
|
|
|
|
Рыцарь-капитан
|
 Регистрация: 14.06.2012
 Сообщений: 511
 Популярность: 7566
 Сказал(а) спасибо: 4
Поблагодарили 181 раз(а) в 88 сообщениях
|
Re: Delphi XE2
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
[Помогите!] Delphi
|
NewSnoopy |
Общение и обсуждение |
22 |
16.11.2011 22:11 |
[Информация] Помощь в Delphi 7 и в других версиях Delphi
|
Babls77 |
Pascal/Delphi |
4 |
03.11.2011 22:27 |
Delphi 7!
|
danil_ |
Общение и обсуждение CrossFire |
5 |
12.07.2011 07:56 |
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 04:52.
|
 |