Форум: "WinAPI";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
ВнизTreeView Найти похожие ветки
← →
djone © (2004-06-29 20:59) [0]Ребята подскажите пожалуйста как иЗ TreeView достать текст
Я использую такой вот метод
Function GetTreeItem(opt:string):string;
const
PROCESS_ACCESS = PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE;
type
PProcData = ^TProcData;
TProcData = record
Item: TTVItem;
Txt: packed array [0 .. 1023] of AnsiChar;
ItemRect: TRect;
end;
var
Cnt,I: Integer;
ProcID: DWord;
ProcessHandle: THandle;
Data: TProcData;
ProcData: PProcData;
Res: Boolean;
begin
ZHWND:=GetFocus;
ProcID := 0;
GetWindowThreadProcessId(ZHWND, ProcID);
ProcessHandle := OpenProcess(PROCESS_ACCESS, False, ProcID);
//if ProcessHandle = 0 then RaiseLastOSError;
try
ProcData := VirtualAllocEx(ProcessHandle, nil, SizeOf(ProcData^),
MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
//if ProcData = nil then RaiseLastOSError;
try
Cnt := TreeView_GetCount(ZHWND);
for I := 0 to Cnt - 1 do
begin
with Data.Item do
begin
//iSubItem := 0;
pszText := @ProcData^.Txt;
cchTextMax := Length(ProcData^.Txt) - 1;
hitem:=;
end;
Res := WriteProcessMemory(ProcessHandle, ProcData,
@Data, SizeOf(Data), PLongWord(nil)^);
if not Res then RaiseLastOSError;
SendMessage(ZHWND, TVM_GETITEM, 0, LongInt(@ProcData^.Item));
Res := ReadProcessMemory(ProcessHandle, ProcData,
@Data, SizeOf(Data), PLongWord(nil)^);
if not Res then RaiseLastOSError;
result:= Data.Txt;
if data.Item.state =TVIS_SELECTED then
begin
if opt="txt" then result:= Data.Txt;
if opt="num" then result:=inttostr(i);
end;
end;
finally
//Res := LongBool(VirtualFreeEx(ProcessHandle, ProcData, 0, MEM_RELEASE));
//if not Res then RaiseLastOSError;
end;
finally
CloseHandle(ProcessHandle);
end;
end;
Но он не работает!
← →
djone © (2004-06-30 12:28) [1]Никто не поможет?
← →
inic © (2004-06-30 15:01) [2]Во-первых вызывает сомнения GetFocus: в Win32 SDK сказано, что эта функция вернет окно с фокусом, если только ее вызвал thread, связанный с этим окном, у тебя же необходимо заиметь окно (treeview) из другого процесса.
← →
inic © (2004-06-30 15:08) [3]Во-вторых: hitem ничему не присваивается !!!
Присвой например SendMessage(hTree, TVM_GETNEXTITEM, TVGN_FIRSTVISIBLE, 0);
Я скопировал твой код, для примера явно присвоил конкретный handle дерева из другого процесса, все работает
← →
djone © (2004-07-05 01:19) [4]А как ты это сделал?
Я не смог потомучто он сказал SendMessage(hTree, TVM_GETNEXTITEM, TVGN_FIRSTVISIBLE, 0); и Htree - Несовместимые типы.
← →
djone © (2004-07-06 13:03) [5]Помогите!!!!! ПОЖАЛУЙСТА!
← →
GrayFace © (2004-07-06 15:58) [6]inic © (30.06.04 15:08) [3]
Скопируй обратно исправленный код и будет всем счастье.
← →
dosik (2004-07-07 01:25) [7]Посмотри макросы типа TreeView_XXX. TreeView - это стандартаная виндовская приблуда, а делфийский компонент, это просто оболочка к ней. В принцие делфи так с ней и работает, посмотри исходники, там все ясно описанно. Удачи )))
← →
djone © (2004-07-08 00:23) [8]Ребята спасайте! Я всё сделал. Всё работает нормально но когда мышкой начинаешь водить , начинаеться пакость
Function GetTreeItem(opt:string):String;
const
PROCESS_ACCESS = PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE;
type
PProcData = ^TProcData;
TProcData = record
Item: TTVItemA;
Txt: packed array [0 .. 1023] of AnsiChar;
ItemRect: TRect;
end;
var
Cnt,I: Integer;
ProcID: DWord;
ProcessHandle: THandle;
Data: TProcData;
ProcData: PProcData;
Res: Boolean;
begin
ZHWND:=getfocus;
ProcID := 0;
GetWindowThreadProcessId(ZHWND, ProcID);
ProcessHandle := OpenProcess(PROCESS_ACCESS, False, ProcID);
//if ProcessHandle = 0 then RaiseLastOSError;
try
ProcData := VirtualAllocEx(ProcessHandle, nil, SizeOf(ProcData^),
MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
//if ProcData = nil then RaiseLastOSError;
try
Cnt := TreeView_GetCount(ZHWND);
// for I := 0 to Cnt - 1 do
//begin
with Data.Item do
begin
//iSubItem := 0;
hitem:=TreeView_GetSelection(zhwnd);
cchTextMax := Length(ProcData^.Txt) - 1;
pszText := @ProcData^.Txt;
end;
Res := WriteProcessMemory(ProcessHandle, ProcData,
@Data, SizeOf(Data), PLongWord(nil)^);
if not Res then RaiseLastOSError;
SendMessage(ZHWND, TVM_GETITEM, 0, LongInt(@ProcData^.Item));
Res := ReadProcessMemory(ProcessHandle, ProcData,
@Data, SizeOf(Data), PLongWord(nil)^);
if not Res then RaiseLastOSError;
result:= Data.Txt
{if data.Item.state =TVIS_SELECTED then
begin
//if opt="txt" then result:= Data.Txt;
//if opt="num" then result:=inttostr(i);
end;}
//end;
finally
//Res := LongBool(VirtualFreeEx(ProcessHandle, ProcData, 0, MEM_RELEASE));
//if not Res then RaiseLastOSError;
end;
finally
CloseHandle(ProcessHandle);
end;
end;
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c