Текущий архив: 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