Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.556 c
14-1129206183
Dust
2005-10-13 16:23
2005.11.06
Блин, народ достали меня делфячие баги меня это уже просто БЕСИТ


14-1129526348
Ega23
2005-10-17 09:19
2005.11.06
С днем рождения! 17 октября


1-1129290248
Lirik
2005-10-14 15:44
2005.11.06
Запретить двигать формой


11-1110873009
hotes
2005-03-15 10:50
2005.11.06
Вопрос по KolOGL12


9-1119442278
Lostcoder
2005-06-22 16:11
2005.11.06
Зеркальное отражение





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский