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

Работа с GUI, чтение заголоквка окна

-

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

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

Ответ
 
Опции темы
Старый 18.02.2016, 21:19   #1
 Разведчик
Аватар для venik0001
 
venik0001 никому не известный тип
Регистрация: 11.04.2014
Сообщений: 2
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
Post Работа с GUI, чтение заголоквка окна

Доброго времени суток!
Пытаюсь прочитать заголовок активного окна руофф, не фига не выходит получаю иероглифы.
Базовую инфу по гую получил тут Оффсеты GUI, в целом все понятно
Нашел на форуме свежие офсеты, спасибо товарищу diagnost, тут у самого с поиском тяжеловато пока, только учусь.
Ну и судя по теме GUI РУОФФ написал процедурку на делфях:
Код:
procedure ReadwinTest();
var
  win_name: array [0..50] of char;
  hProcess: HWND;
  a, pid: DWORD;
  tmp: SIZE_T;
const
  // cтруктура GUI GA+10+08
  game = $D6F84C;
  gui_st1 = $10;
  gui_st2 = $8;
  // указатель на акт. окно GUI+
  gui_cur_win = $74;
  // основные поля структуры окна (WinStruct+...)
  gui_win_name = $4c;
begin
  hProcess:= go_handle();
  GetWindowThreadProcessId(hProcess, @pid);
  hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, pid);

  // чтение названия активного окна
  ReadProcessMemory (hProcess, Ptr(game), @a, SizeOf(a), tmp);
  ReadProcessMemory (hProcess, Ptr(a+gui_st1), @a, SizeOf(a), tmp);
  ReadProcessMemory (hProcess, Ptr(a+gui_st2), @a, SizeOf(a), tmp);
  ReadProcessMemory (hProcess, Ptr(a+gui_cur_win), @a, SizeOf(a), tmp);
  ReadProcessMemory (hProcess, Ptr(a+gui_win_name), @win_name, SizeOf(win_name), tmp);
  ShowMessage(win_name);
end;
Более опытные форумчане, подскажите где косячу?
  Ответить с цитированием
Старый 25.05.2016, 01:50   #2
 Пехотинец
Аватар для diagnost
 
diagnost блестящий пример для подражанияdiagnost блестящий пример для подражанияdiagnost блестящий пример для подражанияdiagnost блестящий пример для подражанияdiagnost блестящий пример для подражанияdiagnost блестящий пример для подражанияdiagnost блестящий пример для подражанияdiagnost блестящий пример для подражанияdiagnost блестящий пример для подражанияdiagnost блестящий пример для подражанияdiagnost блестящий пример для подражания
Регистрация: 02.01.2010
Сообщений: 95
Популярность: 1542
Сказал(а) спасибо: 110
Поблагодарили 460 раз(а) в 288 сообщениях
 
По умолчанию Re: Работа с GUI, чтение заголоквка окна

Вот готовый проект, сам уже неделю разбираюсь. Все работает (не могу найти №) Код корявый(Delphi XE8):
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.CheckLst;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit4: TEdit;
    ComboGUI: TComboBox;
    Radio_Verx: TRadioButton;
    Radio_Niz: TRadioButton;
    Edit_gui: TEdit;
    CheckList_gui: TCheckListBox;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
     game_addr:DWORD;
     gamer_addr: DWORD;
  end;
  const
  BaseAdress = $00DB5BBC;

var
  Form1: TForm1;
  hProcess, ProcessID: DWORD;

  function ReadInt32(addr: DWORD): DWORD;
  function ReadString(addr: int64): UnicodeString;
  function WinStruct(WinName: string): Dword;
  function CtrlCommandAddr(winstruct: Dword; nomctrl: integer): Dword;
  function CtrlEditTextPtr(winstruct: Dword; nomctrl: integer): Dword;
  procedure CtrlCheck(winstruct: Dword; nomctrl: integer; state: boolean);

implementation

{$R *.dfm}

function ReadString(addr: int64): UnicodeString;
const
  len = 255;
var
  st: array [0..len] of widechar;
  BytesCountOfRead: NativeUInt;
begin
  if addr > 0 then
  begin
    ZeroMemory(@st, len*2);
    ReadProcessMemory(hProcess, ptr(addr), @st, len*2, BytesCountOfRead);
    result := st;
  end
  else
    result := '';
end;

function ReadInt32(addr: DWORD): DWORD;
var
  BytesCountOfRead: NativeUInt;
  Value: DWORD;
begin
  if (addr+4 < $FFFFFFFF) then
  try
    ReadProcessMemory(hProcess, ptr(addr), @Value, 4, BytesCountOfRead);
    Result := Value;
  except
    Result := 0;
  end
  else
    Result := 0;
end;

function WinStruct(WinName: string): Dword;
var
  arr, addr, next, res: Dword;
  mass: array[1..20] of AnsiChar;
  rw : NativeUInt;
  name: String;
  i: integer;
begin
  addr := ReadInt32(BaseAdress);
        addr := addr + $1C;
  arr := ReadInt32(addr);
  arr := ReadInt32(arr + $10);
  arr := ReadInt32(arr + $08);
  addr := ReadInt32(arr + $AC);
  while (addr <> 0) do
    begin
      next := ReadInt32(addr + $0);
      addr := ReadInt32(addr + $08);
      res := addr;
      addr := ReadInt32(addr + $4C);
      ReadProcessMemory(hProcess, ptr(addr), @mass, sizeof(mass), rw);
      i := 1;
      name := '';
      while (mass[i] <> '') do
        begin
          name := name + mass[i];
          inc(i);
        end;
      if (name = WinName) then
        begin
          result := res;
          exit;
        end;
      addr := next;
    end;
  addr := ReadInt32(arr + $8C);
  while (addr <> 0) do
    begin
      next := ReadInt32(addr + $0);
      addr := ReadInt32(addr + $08);
      res := addr;
      addr := ReadInt32(addr + $4C);
      ReadProcessMemory(hProcess, ptr(addr), @mass, sizeof(mass), rw);
      i := 1;
      name := '';
      while (mass[i] <> '') do
        begin
          name := name + mass[i];
          inc(i);
        end;
      if (name = WinName) then
        begin
          result := res;
          exit;
        end;
      addr := next;
    end;
  result := 0;
end;

function CtrlCommandAddr(winstruct: Dword; nomctrl: integer): Dword;
var
  addr: Dword;
  i: integer;
begin
  addr := ReadInt32(winstruct + $1C8);
  for i := 1 to nomctrl do
    addr := ReadInt32(addr + $04);
  addr := ReadInt32(addr + $08);
  result := ReadInt32(addr + $1C);
end;

function CtrlEditTextPtr(winstruct: Dword; nomctrl: integer): Dword;
var
  addr: Dword;
  i: integer;
begin
  addr := ReadInt32(winstruct + $1C8);
  for i:=1 to nomctrl do
    addr := ReadInt32(addr + $04);
  addr := ReadInt32(addr + $08);
  result := addr + $13FC;
end;

procedure CtrlCheck(winstruct: Dword; nomctrl: integer; state: boolean);
var
    addr: Dword;
    i:integer;
    rw: NativeUInt;
begin
  addr := ReadInt32(winstruct+$1C8);
  for i:=1 to nomctrl do
    addr := ReadInt32(addr+$04);
  addr := ReadInt32(addr+$08);
  writeprocessmemory(hProcess, ptr(addr+$121), @state, sizeof(state), rw);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  arr, next, nexd, res, red, Ctrl_addr, Cap_addr, Nom: Dword;
  mass: array[1..20] of AnsiChar;
  rw : NativeUInt;
  name, Ctrl_Name, Cap_Name: String;
  i: DWORD;
  addr, GUI, WinVerx, WinNiz: DWORD;
  BytesCountOfRead: NativeUint;
begin
  ProcessID:=0;
  GetWindowThreadProcessId(FindWindow(nil,PChar(Edit4.Text)),@ProcessID);
  if ProcessID<>0 then
    begin
      hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,ProcessID);
      if hProcess <> 0 then
      begin
        ComboGui.Clear;
        addr := ReadInt32(BaseAdress);
        game_addr := addr + $1C;
        addr := ReadInt32(game_addr);
        addr := ReadInt32(addr + $10);
        GUI := ReadInt32(addr + $08);
        WinVerx := ReadInt32(GUI + $8C);
        WinNiz := ReadInt32(GUI + $AC);
       if Radio_Verx.Checked then
          addr := WinVerx
          else
          addr := WinNiz;
  while (addr <> 0) do
    begin
      next := ReadInt32(addr);
      addr := ReadInt32(addr + $08);
      res := addr;
        addr := ReadInt32(addr + $4C);

        ReadProcessMemory(hProcess, ptr(addr), @mass, sizeof(mass), rw);
        i := 1;
        name := '';
        while (mass[i] <> '') do
        begin
          name := name + mass[i];
          inc(i);
        end;
        ComboGui.Items.Add(Name);
       //GUIList.Items.Add(name + '  ***  ' + Ctrl_Name+ '  ***  ' + IntToStr(Nom) + '  ***  ' + Cap_Name);
      addr := next;
    end;
      CloseHandle(hProcess);
      end;
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
addr, next, conaddr, ctrlcom: dword;
mass: array[1..20] of AnsiChar;
rw: Nativeuint;
i: integer;
Name, ctrlname:String;
begin
  ProcessID:=0;
  GetWindowThreadProcessId(FindWindow(nil,PChar(Edit4.Text)),@ProcessID);
  if ProcessID<>0 then
    begin
      hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,ProcessID);
      if hProcess <> 0 then
      begin
        CheckList_gui.Clear;
        addr := winstruct(edit_gui.Text);
        addr := readint32(addr + $1C8);
        while (addr <> 0) do
           begin
              next := ReadInt32(addr + $0C);
              addr := ReadInt32(addr + $08);
              conaddr := addr;
              addr := ReadInt32(addr + $B8);
              Name := readstring(addr + $0);
              ctrlcom:= readint32(conaddr + $18);
              ReadProcessMemory(hProcess, ptr(ctrlcom), @mass, sizeof(mass), rw);
              i := 1;
              ctrlname := '';
              while (mass[i] <> '') do
                begin
                   ctrlname := ctrlname + mass[i];
                   inc(i);
                end;
              CheckList_gui.Items.Add(name + '___' + ctrlname);
              addr := next;
           end;
      end;
    end;
    CloseHandle(hProcess);
end;

end.
  Ответить с цитированием
Ответ


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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Помогите!] Чтение памяти igo3000 Общение разработчиков 12 16.04.2016 12:28
[Помогите!] Чтение из файла Unheilig)) Общение разработчиков 7 19.10.2013 20:01
c# чтение ini Mr.Misha Вопросы и ответы, обсуждения 4 04.08.2013 15:35
[Продам] Смотрим в темке darorib Cross Fire 7 18.06.2013 10:09

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

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

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