Форум: "WinAPI";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];
ВнизКак получить текст из SysListView32 Найти похожие ветки
← →
Хинт © (2005-07-26 11:45) [0]WM_GETTEXT не работает
Посоветуйте возможные пути решения.
← →
alpet © (2005-07-26 11:51) [1]Оригиналоный способ:)
Сообщение должно быть LVM_GETITEMTEXТ. Если указанный контрол еще и в другом процессе - сначала потребуется выделить в АП того процесса немного памяти (VirtualAllocEx), и потом скопировать в АП своего (ReadProcessMemory).
← →
Хинт © (2005-07-26 12:06) [2]Большое спасибо. Сам я в этом не разберусь, но зато теперь знаю что конкретно мне искать.
← →
Хинт © (2005-07-26 12:22) [3]Ничего не могу найти :( Все примеры на сохранение позиций значков Desktop"а и восстановление их...
← →
Хинт © (2005-07-26 14:29) [4]Вот что у меня получилось:
procedure GetText(ListWND: HWND);
const
PROCESS_ACCESS = PROCESS_VM_OPERATION or PROCESS_VM_READ or
PROCESS_VM_WRITE;
type
PProcData = ^TProcData;
TProcData = record
Item: TLVItemA;
Txt: packed array[0..1023] of AnsiChar;
ItemRect: TRect;
end;
var
Cnt, I: Integer;
ProcID: DWORD;
ProcessHandle: THandle;
Data: TProcData;
RemoteProcData: PProcData;
Res: Boolean;
LI: TListItem;
ColWid: Integer;
pt: TPoint;
begin
// Получение PID процесса
ProcID := 0;
GetWindowThreadProcessId(ListWND, ProcID);
if ProcId = 0 then
begin
MessageDlg("Cannot retrieve process ID.", mtError, [mbOK], 0);
Exit;
end;
// Открытие доступа к стороннему процессу
ProcessHandle := OpenProcess(PROCESS_ACCESS, False, ProcID);
if ProcessHandle = 0 then RaiseLastOSError;
try
// Выделение памяти в ВАП нужного нам процесса
RemoteProcData := VirtualAllocEx(ProcessHandle, nil,
SizeOf(RemoteProcData^), MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
if RemoteProcData = nil then RaiseLastOSError;
try
Cnt := ListView_GetItemCount(ListWND); // Получение кол-ва иконок
for I := 0 to Cnt - 1 do
begin
FillChar(Data, SizeOf(Data), 0); // Обнуление структуры
// Заполнение структуры LV_ITEM
with Data.Item do
begin
iSubItem := 0;
pszText := @RemoteProcData^.Txt;
cchTextMax := SizeOf(RemoteProcData^.Txt) - 1;
end;
// Копирование структуры из нашего приложения в чужое
Res := WriteProcessMemory(ProcessHandle, RemoteProcData,
@Data, SizeOf(Data), PLongWord(nil)^);
if not Res then RaiseLastOSError;
// Получение текста
SendMessage(ListWND, LVM_GETITEMTEXT, I, LPARAM(@RemoteProcData^.Item));
// Получение координат прямоугольника
SendMessage(ListWND, LVM_GETITEMRECT, I, LPARAM(@RemoteProcData^.ItemRect));
// Чтение полученных данных из чужого ВАП в наш
Res := ReadProcessMemory(ProcessHandle, RemoteProcData,
@Data, SizeOf(Data), PLongWord(nil)^);
if not Res then RaiseLastOSError;
// Добавление параметров в Memo
Form1.Memo1.Lines.Add(data.txt)
end;
finally
// Освобождение памяти
Res := LongBool(VirtualFreeEx(ProcessHandle, RemoteProcData,
0, MEM_RELEASE));
if not Res then RaiseLastOSError;
end;
finally
// Закрытие дескриптора
CloseHandle(ProcessHandle);
end;
end;
Но данный вариант получает текст только из первого столбца. Как обратиться ко всем остальным ячейкам?
← →
begin...end © (2005-07-26 14:33) [5]> Хинт © (26.07.05 14:29) [4]
> // Заполнение структуры LV_ITEM
> with Data.Item do
> begin
> iSubItem := 0;
> Как обратиться ко всем остальным ячейкам?
The iSubItem member specifies the index of a subitem, or it can be zero to get the item label.
← →
Хинт © (2005-07-26 14:39) [6]2begin...end
Спасибо за ответ, но я не совсем понимаю как работает этот код, поэтому нельзя ли объяснит немного поподробнее?
← →
Хинт © (2005-07-26 15:14) [7]В моем случае имеются только 2 столбца. Как мне получить текст из обоих?
← →
alpet © (2005-07-26 15:19) [8]Хинт © (26.07.05 15:14) [7]
Получаешь из первого, потом из второго. Т.е. iSubItem = 0 и 1.
← →
Хинт © (2005-07-26 18:58) [9]Огромное спасибо. Разобрался.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c