Главная страница
    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.47 MB
Время: 0.042 c
14-1129239730
ron
2005-10-14 01:42
2005.11.06
Independent Software Developers Forum (ISDEF)


4-1125318964
Uran
2005-08-29 16:36
2005.11.06
Разрешения в реестре


3-1127462400
agp200431
2005-09-23 12:00
2005.11.06
Правильно ли я делаю что базу IB 6.0 бекаплю а потом разархивирую


4-1125679951
Ксардас
2005-09-02 20:52
2005.11.06
Подскажите ссылочку или в каком направлении копать


14-1129384606
Piter
2005-10-15 17:56
2005.11.06
Подскажите где скачать кодек MPEG2





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский