Функция FindWindowEx не может найти Label

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Viktor Zull писал(а):Текст в этой метке может изменяться в процессе работы программы. Может быть любым. Я знаю что изначально при запуске программы текст в метке: Label1. Если я отредактирую hex редактором exe - поставлю свой текст, то сначала это будет мой текст, а затем он будет изменен. Верно?
Верно .
Viktor Zull
Сообщения: 117
Зарегистрирован: 10 ноя 2005, 02:00

А как насчет изменения значения в процессе работы программы? Можно в памяти найти ячейку где хранится значение метки и изменить его?
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Да вроде бы можно сдампить память процесса, найти текст в буфере, вычислить смещение и записать данные, но на практике такого не делал.
Ни что так не ограничивает фантазию программиста, как компилятор...
Viktor Zull
Сообщения: 117
Зарегистрирован: 10 ноя 2005, 02:00

Интересно как "сдампить память процесса". Может кто-нибудь подскажет как это сделать. Я такими вещами еще не занимался, даже затрудняюсь с чего начать.

Может есть ссылки или примеры.
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Вообще идея такая(это только идея, я её не проверял):
-Запустить программу на выполнение и получить указатель на процесс
-Получить дамп памяти процесса(короче записать память процесса в буфер) с помощью ReadProcessMemory
-Просканировать буфер на наличие нужного слова(нужной последовательности байтов) и вычислить позицию данного блока в буфере
-Записать измененные данные с помощью WriteProcessMemory

В принципе ничего сложного, ноработоспособность не гарантирую-сам не делал

А вот на счет конкретных примеров-ничего вразумительного не нашел.
Ни что так не ограничивает фантазию программиста, как компилятор...
Viktor Zull
Сообщения: 117
Зарегистрирован: 10 ноя 2005, 02:00

Как получить указатель на процесс? Через FindWindow через Handle можно?
Viktor Zull
Сообщения: 117
Зарегистрирован: 10 ноя 2005, 02:00

Чтобы получить указатель на процесс нужно использовать функцию GetWindowThreadProcessId?
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Указатель не проблема, его можно получить при запуске приложения, вот как получить размер памяти процесса и базовый адрес - вот это вопрос.
Ни что так не ограничивает фантазию программиста, как компилятор...
Viktor Zull
Сообщения: 117
Зарегистрирован: 10 ноя 2005, 02:00

Мне при запуске моей программы нужно получать указатель чужой программы? Повашему это не сложно? Подскажите как?

Почему именно при запуске?
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Нет, я имел в виду то, что вы сами запускаете чужую программу.
Или нужно работать с уже запущенной программой?
Вообще я имел в виду такой метод:
[syntax='Delphi']
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;

implementation

{$R *.dfm}

function WinExecAndWait32(FileName: String;
Visibility: integer): cardinal;
var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
setcurrentdir(workdir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName,
nil,
nil,
false,
CREATE_NEW_CONSOLE or
NORMAL_PRIORITY_CLASS,
nil,
nil,
StartupInfo,
ProcessInfo) then Result :=1
else begin
end;

//В ProcessInfo.hProcess будем иметь указатель на процесс


end;


end.

[/syntax]
Ни что так не ограничивает фантазию программиста, как компилятор...
Ответить