Регистрация Главная Сообщество
Сообщения за день Справка Регистрация

Выбор между Handle клиента Delphi

-

Общение разработчиков

- Программирование для Perfect World, общение и обсуждене разработок

Ответ
 
Опции темы
Старый 15.01.2016, 22:00   #1
 Разведчик
Аватар для fer@bk.ru
 
fer@bk.ru неизвестен в этих краяхfer@bk.ru неизвестен в этих краяхfer@bk.ru неизвестен в этих краях
Регистрация: 17.01.2011
Сообщений: 1
Популярность: -290
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
Exclamation Выбор между Handle клиента Delphi

Помогите пожалуйста я уже весь мозг сломал
как мне сделать переход от окна к окну через ComboBox

Суть вот в чём, я запускаю программу она находит нужное мне окно, окон может быть много как только окно найдено автоматически я считываю значение из памяти имени, допустим персонажа и меняю название окна, на название его имени,
после чего я вывожу найденные окна которым уже присвоено имя из памяти в ComboBox ' sComboBox1.Items.Add(''+Nm+'') ;

Вот после этого мне нужно чтобы при выборе из списка 'ComboBox' имени персонажа и нажатии на кнопку я мог открыть процесс считывания памяти конкретно из этого окна

Заранее Спасибо

Нужно чтобы вот этот процесс применялся к выбранному окну в ComboBox

PHP код:
var 
Client Window:HWND//Handle клиента 
  
Processed:Integer
  
process:Integer//Идентификатор объекта 
  
Window Nameinteger
  
Client Window := FindWindow(nilPChar('Окно которое выбрано по имени персонажа в ComboBox'));   //Находим Handle окна 
GetWindowThreadProcessed(Client Window,@Processed); //Получаем И.П. 
process := OpenProcess(PROCESS_ALL_ACCESS,False,Processed); //Открываем процесс с возможностью записи 
Код определения окна и чтения из памяти имени персонажа


PHP код:
procedure TForm1.FormActivate(SenderTObject); 
    var 
    
Wd HWnd
  
buf,Nm: array [0..255of char
  
iinteger
  
PIDdword
  
lpBuffer:DWord
  
WNik: array[0..255of widechar
  
sWideString
  
NoBSIZE_T
  
LvL,ClassID:Integer
  
Lvel,WClassID:DWord
  
begin 
   i
:= 0
    
smemo2.Clear;         // Очистим список перед началом поисков 
    
Wd:=FindWindow(0,0);          // Найдем первое окно верхнего уровня любого класса 
    
While (Wd<>0) do              // Если такое окно существует 
    
Begin 
        GetClassName
(wd,@buf,100);    //Получаем класс окна (Чувствителен к регистру) 
        
if buf='Имя Окна Window' then  // Если наше 
          
begin 
            GetWindowThreadProcessId
(wd, @PID); 
            
hProcess:=OpenProcess(PROCESS_ALL_ACCESSFalsePID); 
//-----читаю-память--------------------------------------------------------------- 
            
ReadProcessMemory (hProcessPointer($00D6F84C), @lpBuffersizeof(lpBuffer), NoB); 
            
ReadProcessMemory (hProcessPointer(lpBuffer+$28), @lpBuffersizeof(lpBuffer), NoB); 
            
ReadProcessMemory (hProcessPointer(lpBuffer+$6E8), @lpBuffersizeof(lpBuffer), NoB); 
            
ReadProcessMemory (hProcessPointer(lpBuffer+StrToInt('$0')), @WNiksizeof(WNik), NoB); 
            
:= WNik
//------------------------------------------------------------------------------------ 
            //Делаем Заголовок окна по имени игрока 
            
setWindowText(Wd,(s)); 
            
GetWindowText(Wd,Nm,255);       //получаем название окна 
            
smemo2.Lines.Add(s);        
            
smemo2.Lines.Add('Class: '+buf);         // Добавим в список 
            
smemo2.Lines.Add('Window: '+Nm); 
            
smemo2.Lines.Add('HWnd: '+IntToStr(Wd)); 
             
Form1.sComboBox1.Items.Add(''+Nm+'') ;// Вы вожу в ComboBox1 
            
inc(i); 
            
CloseHandle(hProcess); 
            
hProcess:= 0
  
          
end
        
Application.ProcessMessages;         // Дадим возможность поработать другим 
        
Wd:=GetNextWindow(Wd,GW_HWNDNEXT);   // Найдем следующее окно в системе. 
  
    
End
    
smemo2.Lines.Add('Найдено окон: '+inttostr(i)); 
  
end
  Ответить с цитированием
Старый 15.01.2016, 22:28   #2
Reaper
 Фельдмаршал
Аватар для Dinmaite
 
Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(
Регистрация: 13.08.2009
Сообщений: 1,004
Популярность: 25098
Золото Zhyk.Ru: 350
Сказал(а) спасибо: 110
Поблагодарили 830 раз(а) в 395 сообщениях
Отправить сообщение для Dinmaite с помощью ICQ
 
По умолчанию Re: Выбор между Handle клиента Delphi

Код:
var
  akk:array [0..50]of record
                        PID:Dword;
                      end;


function EnumProc (h: HWnd; Param: LongInt): Boolean; stdcall;
var
p:array [0..255] of char;
bufs:array [1..60] of widechar;
PID,hProc,nbyte:dword;
bufd:dword;
buf:byte;
Begin
  GetClassName(h ,p,sizeof(p));
  if p='ElementClient Window' then
    begin
      GetWindowThreadProcessId(h, @PID);
      hProc:=OpenProcess(PROCESS_ALL_ACCESS, False, PID);
      if hProc <> 0 then
        begin
          readprocessmemory(hProc,ptr(addr_level),@buf,1,nbyte);
          //проверка версии
          if (buf=strtoint('$'+copy(code_lvlST,1,2))) or (buf=strtoint('$'+code_lvl_1)) then
            begin
              readprocessmemory(hProc,ptr(base_addr),@bufd,4,nbyte);
              readprocessmemory(hProc,ptr(bufd+$20),@bufd,4,nbyte);
              readprocessmemory(hProc,ptr(bufd+Nick_offs),@bufd,4,nbyte);
              readprocessmemory(hProc,ptr(bufd),@bufs,60,nbyte);
              form1.ComboBox1.Items.Add(string(bufs));
              akk[form1.ComboBox1.Items.Count-1].PID:=PID;
            end;
        end;
      closehandle(hProc);
    end;
  EnumProc := TRUE;
end;

procedure TForm1.ComboBox1DropDown(Sender: TObject);
begin
  combobox1.Items.Clear;      // Очистим список перед началом поисков
  EnumWindows (@EnumProc, 0); // и скажем - искать
end;
sic!

Забыл кусочек.

Собственно как организовано подключение к процессу:
Код:
hProc:=OpenProcess(PROCESS_ALL_ACCESS, False, akk[combobox1.ItemIndex].PID);

Последний раз редактировалось Dinmaite; 15.01.2016 в 22:38.
  Ответить с цитированием
Старый 15.01.2016, 23:48   #3
 Разведчик
Аватар для fer@bk.ru
 
fer@bk.ru неизвестен в этих краяхfer@bk.ru неизвестен в этих краяхfer@bk.ru неизвестен в этих краях
Регистрация: 17.01.2011
Сообщений: 1
Популярность: -290
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
Question Re: Выбор между Handle клиента Delphi

Скажите пожалуйста где тут не правильно
и откуда брать переменные addr_level, code_lvlST,code_lvl_1
Код:
function EnumProc (Wd: HWnd; Param: LongInt): Boolean; stdcall;
var
NoB: SIZE_T;
p:array [0..255] of char;
WNik,bufs:array [1..60] of widechar;
s: WideString;
PID,hProc,nbyte:dword;
lpBuffer:dword;
buf:byte;
Begin
  GetClassName(Wd ,p,sizeof(p));
  if p='ElementClient Window' then
    begin
      GetWindowThreadProcessId(Wd, @PID);
      hProc:=OpenProcess(PROCESS_ALL_ACCESS, False, PID);
      if hProc <> 0 then
        begin
           readprocessmemory(hProc,ptr(addr_level),@buf,1,nbyte);
          //проверка версии
            if (buf=strtoint('$'+copy(code_lvlST,1,2))) or (buf=strtoint('$'+code_lvl_1)) then
            begin
              ReadProcessMemory (hProcess, Pointer($00D6F84C), @lpBuffer, sizeof(lpBuffer), NoB);
              ReadProcessMemory (hProcess, Pointer(lpBuffer+$28), @lpBuffer, sizeof(lpBuffer), NoB);
              ReadProcessMemory (hProcess, Pointer(lpBuffer+$6E8), @lpBuffer, sizeof(lpBuffer), NoB);
              ReadProcessMemory (hProcess, Pointer(lpBuffer+StrToInt('$0')), @WNik, sizeof(WNik), NoB);
              s := WNik;
              form1.sComboBox1.Items.Add((s));
              akk[form1.sComboBox1.Items.Count-1].PID:=PID;
            end;
        end;
      closehandle(hProc);
    end;
  EnumProc := TRUE;
end;



procedure TForm1.sComboBox1DropDown(Sender: TObject);
begin
scombobox1.Items.Clear;      // Очистим список перед началом поисков
EnumWindows (@EnumProc, 0); // и скажем - искать
end;

procedure TForm1.sSpeedButton1Click(Sender: TObject);
var
PID,hProc,nbyte:dword;
begin
hProc:=OpenProcess(PROCESS_ALL_ACCESS, False, akk[scombobox1.ItemIndex].PID);
end;
  Ответить с цитированием
Старый 16.01.2016, 00:05   #4
Reaper
 Фельдмаршал
Аватар для Dinmaite
 
Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(
Регистрация: 13.08.2009
Сообщений: 1,004
Популярность: 25098
Золото Zhyk.Ru: 350
Сказал(а) спасибо: 110
Поблагодарили 830 раз(а) в 395 сообщениях
Отправить сообщение для Dinmaite с помощью ICQ
 
По умолчанию Re: Выбор между Handle клиента Delphi

Выброси полностью две строки с неизвестными константами. Первая для проверки версии. Вторая для проверки установки патча. Тебе они не нужны.
А неверны возможно адреса. Не могу с этим помочь.
  Ответить с цитированием
Старый 16.01.2016, 08:14   #5
 Сержант
Аватар для pw.assistant
 
pw.assistant излучает ауруpw.assistant излучает ауруpw.assistant излучает ауруpw.assistant излучает ауруpw.assistant излучает ауруpw.assistant излучает ауру
Регистрация: 16.02.2012
Сообщений: 105
Популярность: 651
Сказал(а) спасибо: 19
Поблагодарили 39 раз(а) в 31 сообщениях
 
По умолчанию Re: Выбор между Handle клиента Delphi

А если использовать не form1.sComboBox1.Items.Add((s)), а form1.sComboBox1.AddObject(s, pointer(PID)), то и массив akk будет не нужен. Handle нужного процесса можно будет получать hProc:=OpenProcess(PROCESS_ALL_ACCESS, False, dword(combobox1.Items.Objects[combobox1.ItemIndex]));

а если не закрывать процесс в EnumProc (убрать closehandle(hProc)), то можно вообще сразу Handle процесса запоминать form1.sComboBox1.AddObject(s, pointer(hProc)), а получать так hProc:=THandle(combobox1.Items.Objects[combobox1.ItemIndex]); Правда closehandle(hProc) все же надо будет сделать перед перечитыванием.
for i:=0 combobox1.Items.Count-1 do
closehandle(THandle(combobox1.Items.Objects[i]));
combobox1.clear;
________________
backup - акт проявления трусости

Последний раз редактировалось pw.assistant; 16.01.2016 в 08:18.
  Ответить с цитированием
Старый 16.01.2016, 13:51   #6
Reaper
 Фельдмаршал
Аватар для Dinmaite
 
Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(
Регистрация: 13.08.2009
Сообщений: 1,004
Популярность: 25098
Золото Zhyk.Ru: 350
Сказал(а) спасибо: 110
Поблагодарили 830 раз(а) в 395 сообщениях
Отправить сообщение для Dinmaite с помощью ICQ
 
По умолчанию Re: Выбор между Handle клиента Delphi

Вот только стандартная компонента TCombobox не поддерживает добавление объекта (как минимум D7), а AlphaControls установлен не у всех.
  Ответить с цитированием
Старый 18.01.2016, 22:01   #7
 Разведчик
Аватар для fer@bk.ru
 
fer@bk.ru неизвестен в этих краяхfer@bk.ru неизвестен в этих краяхfer@bk.ru неизвестен в этих краях
Регистрация: 17.01.2011
Сообщений: 1
Популярность: -290
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Выбор между Handle клиента Delphi

Может кто знает как прочесть Мировой чат на Delphi
как до него вообще добратся
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Помогите!] Нужна программа с режимом Handle Lividan Общение и обсуждение, архив Lineage 2 0 30.06.2014 12:58
[Помогите!] Handle(главное окно) CSharp coder Вопросы и ответы, обсуждения 1 17.06.2013 11:25
[Помогите!] Поиск Handle нескольких окон (Delphi) krysun Общение разработчиков 0 12.05.2011 13:57

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 04:09.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net