Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

LISTVIEW_GETITEMTEXT из чужого окна   Найти похожие ветки 

 
v850 ©   (2005-08-29 18:06) [0]

Добрый день!
 Не могу прочитать содержимое чужого listview!!!
LVM_getitemtext - работает только со своим окном (своим приложением), если указываем чужой handle - ничего не работает ! Неделю сижу , ничего не получается !
Может кто сталкивался с подобными проблемами?
Спасибо !


 
Игорь Шевченко ©   (2005-08-29 18:09) [1]


> Может кто сталкивался с подобными проблемами?


Очевидно, структура LVITEM, адрес которой передается в LParam недействительна в адресном пространстве чужого процесса ? :)
Если очень хочется, то надо делать хук, внедряться в чужой процесс, читать текст там и передавать его в твой процесс.


 
alpet ©   (2005-08-29 18:12) [2]

LISTVIEW_GETITEMTEXT из чужого окна [D7, WinXP]

Ой, это сложно - надо виртуальную память читать из чужого процесса, а это иногда еще может не получиться. Но на всякий случай можно порыть в справке на предмет VirtualAllocEx и ReadProcessMemory.


 
v850 ©   (2005-08-29 18:19) [3]

Спасибо за мгновенные ответы )

А есть ли другие способы прочитать содержимое ? (не прибегая к gettextitem)


 
alpet ©   (2005-08-29 18:22) [4]

v850 ©   (29.08.05 18:19) [3]

Сделать скриншот ListView, и при помощи мудренного OCR алгоритма распознать что в нем за текст. Если строк много, контрол придется проскроллить и сфотографировать несколько раз.


 
Джо ©   (2005-08-29 19:21) [5]

Может быть, это немного упростит твою задачу.


unit ProcList;

interface
uses Windows, TlHelp32, SysUtils, Contnrs;

type

 TProcess = class
 private
   FId: Integer;
   FExeName: string;
   FHandle: THandle;
   function GetHandle: THandle;
   function IsOpen: Boolean;
 public
   property Id: Integer read FId;
   property ExeName: string read FExeName;
   property Handle: THandle read GetHandle;
   constructor Create (const AEntry: PROCESSENTRY32);
   destructor Destroy; override;
   function Open: THandle;
   procedure Close;
   function ReadMemory (BaseAddr: Pointer; var Data; Size: Longint): Cardinal;
 end;

 TProcessList = class
 private
   FList: TObjectList;
   function GetCount: Integer;
   function GetItems(Index: Integer): TProcess;
 protected
   procedure Clear;
   procedure AddProcess (const AEntry: PROCESSENTRY32);
 public
   constructor Create;
   destructor Destroy; override;
   function ProcessByExeName (AName: string): TProcess;
   procedure Populate;
   property Count: Integer read GetCount;
   property Items[Index: Integer]: TProcess read GetItems; default;
 end;

implementation

{ TProcessList }

procedure TProcessList.AddProcess(const AEntry: PROCESSENTRY32);
begin
 FList.Add(TProcess.Create(AEntry))
end;

procedure TProcessList.Clear;
begin
 FList.Clear
end;

constructor TProcessList.Create;
begin
 inherited Create;
 FList := TObjectList.Create(True);
 Populate;
end;

destructor TProcessList.Destroy;
begin
 FList.Free;
 inherited;
end;

function TProcessList.GetCount: Integer;
begin
 Result := FList.Count
end;

function TProcessList.GetItems(Index: Integer): TProcess;
begin
 Result := TProcess(FList[Index])
end;

procedure TProcessList.Populate;
var
 Snapshot: THandle;
 ProcInfo: PROCESSENTRY32;
begin
 Clear;

 Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 if Snapshot <> INVALID_HANDLE_VALUE then
 begin
   try
     ProcInfo.dwSize := SizeOf(ProcInfo);
     if Process32First (Snapshot,ProcInfo) then
       repeat
         AddProcess(ProcInfo)
       until not Process32Next (Snapshot, ProcInfo);
   finally
     CloseHandle (Snapshot);
   end;
 end;

end;

// функция ищет и возвращает первый процесс с заданным именем исполнимого файла
// к регистру не чувствительна
// если не найден, возвращает nil
function TProcessList.ProcessByExeName(AName: string): TProcess;
var
 I: Integer;
begin
 Result := nil;
 AName := AnsiUpperCase(AName);
 for I := 0 to Count-1 do
   if AnsiUpperCase(Items[I].ExeName) = AName then
   begin
     Result := Items[I];
     Break
   end
end;

{ TProcess }

procedure TProcess.Close;
begin
 if IsOpen then
 begin
   CloseHandle(FHandle);
   FHandle := INVALID_HANDLE_VALUE
 end;
end;

constructor TProcess.Create(const AEntry: PROCESSENTRY32);
begin
 inherited Create;
 FId := AEntry.th32ProcessID;
 FExeName := AEntry.szExeFile;
 FHandle := INVALID_HANDLE_VALUE;
end;

destructor TProcess.Destroy;
begin
 Close;
 inherited;
end;

function TProcess.GetHandle: THandle;
begin
 if FHandle <> INVALID_HANDLE_VALUE then
   Result := FHandle
 else
   raise Exception.Create("Process not open");
end;

function TProcess.IsOpen: Boolean;
begin
 Result := FHandle <> INVALID_HANDLE_VALUE
end;

function TProcess.Open: THandle;
begin
 if IsOpen then
   raise Exception.Create("Process already open");

 FHandle := Windows.OpenProcess(PROCESS_VM_READ {or PROCESS_VM_WRITE},False,FId);
 if FHandle = 0 then
   RaiseLastOSError;
   
 Result := FHandle;
end;

function TProcess.ReadMemory(BaseAddr: Pointer; var Data;
 Size: Integer): Cardinal;
begin
 ReadProcessMemory(FHandle,BaseAddr,@Data,Size,Result);
end;


Пример чтения памяти процесса:

var
 I: Integer;
 Proc: TProcess;
 ProcList: TProcessList;
begin
 ProcList := TProcessList.Create;
 try
   Proc := ProcList.ProcessByExeName("project1.exe");
   if Proc <> nil then
   begin
     Proc.Open;
     try
       // тут передаешь адрес в чужом адресном пространстве,
       // указатель на свой буфер, куда будут складываться прочитанные данные
       // и кол-во байт, которое необходимо прочитать
       Proc.ReadMemory(...);
     finally
       Proc.Close;
     end;
   end;
 finally
   ProcList.Free;
 end;

end;



Страницы: 1 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.034 c
14-1129217046
ArtemESC
2005-10-13 19:24
2005.11.06
Дизассемблер-редактор


2-1129059369
DroNIX
2005-10-11 23:36
2005.11.06
Как рационально изменить формулу


2-1129181270
SnakeAK
2005-10-13 09:27
2005.11.06
Курсор


6-1122025060
KirGus
2005-07-22 13:37
2005.11.06
У меня такая проблема с клиент-сокетом:


14-1128680845
SPeller
2005-10-07 14:27
2005.11.06
Бас-подгон от государства