Форум: "WinAPI";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];
ВнизCheckbox в чужом SysTreeView32 Найти похожие ветки
← →
ekap (2007-03-22 15:08) [0]В чужом приложении есть деревовидный компонент SysTreeView32 у каждого элемента дерева есть checkbox собственно вопрос как можно отметить\ снять отметку с чекбокса. Хотелось бы увидеть пример.
Спасибо.
← →
Сергей М. © (2007-03-22 16:54) [1]
> В чужом приложении есть .. компонент
Что, там прямо так и написано - "компонент" ?)
← →
ekap (2007-03-22 16:59) [2]Ну пусть будет "окно класса SysTreeView32"
я думаю ты понял и так о чем речь
← →
Сергей М. © (2007-03-22 17:02) [3]Ну а раз таки окно, то см. функции TreeView_XXXXX()
← →
ekap (2007-03-22 17:09) [4]Я даже нашел описание как это сделать: "Сначало нужно будет в удаленном АП выделить память через VirtualAllocEx потом записать туда структуру TTVItem и только потом сделать TreeView_SetItem с указателем на адрес структуры..."
(c) Rouse_
но пока опыта не хватает перерыл кучу сайтов в томчисле и китайских примеров нет :(
← →
Rouse_ © (2007-03-22 17:18) [5]http://www.google.ru/search?sourceid=navclient&hl=ru&ie=UTF-8&rls=GGLJ,GGLJ:2006-48,GGLJ:ru&q=VirtualAllocEx+TTVItem
← →
ekap (2007-03-22 17:25) [6]Так я тоже искал... часть примеров пробовал переделать, ничего не получилось.
P.S. а по ключевым словам из твоего поста:
VirtualAllocEx TTVItem TreeView_SetItem
Вобще нахдоит всего одну ссылку на тот сайт где он размещен :(
← →
Rouse_ © (2007-03-22 17:40) [7]Ну сейчас нет времени пример писать... Так что либо жди либо проси народ :) Есть пример для RichView (читает текст из WORDPAD-а), может поможет...
unit MainUnit;
interface
uses
Windows, Messages, Graphics, Controls, Forms, ComCtrls,
StdCtrls, Classes, SysUtils, Dialogs;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Memo1: TMemo;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
uses RichEdit;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
{$DEFINE DEBUG_FIND}
var
MainWindowHandle, RichEditWHandle: THandle;
ProcessID : Cardinal;
ProcessHandle : THandle;
StructTextEx: TGetTextEx;
StructTextLength: TGetTextLengthEx;
PStructTextLength, PStructTextEx, PTextBuffer: Pointer;
BytesWriten, RichEditTextLength: DWORD;
TextBuffer: array of Char;
begin
{$IFDEF DEBUG_FIND}
// Заполняем данные для отладки
// В качестве примера работаем с WordPad-ом
Edit1.Text := "Document - WordPad";
Edit2.Text := "RICHEDIT50W";
{$ENDIF}
// Ищем окно
MainWindowHandle := FindWindow(nil , PChar(Edit1.Text));
if MainWindowHandle = 0 then RaiseLastOSError;
RichEditWHandle := FindWindowEx(MainWindowHandle, 0, PChar(Edit2.Text), nil);
if RichEditWHandle = 0 then RaiseLastOSError;
// Узнаем ID процесса
GetWindowThreadProcessId(MainWindowHandle, @ProcessID);
if ProcessID = 0 then RaiseLastOSError;
// Открываем процесс
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, True, ProcessID);
if ProcessHandle = 0 then RaiseLastOSError;
try
// Выделяем в нем память под структуру TGetTextLengthEx
PStructTextLength := VirtualAllocEx(ProcessHandle, nil,
SizeOf(TGetTextLengthEx), MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
if PStructTextLength = nil then RaiseLastOSError;
try
// Подготавливаем структуру...
StructTextLength.flags := GTL_NUMBYTES or GTL_USECRLF;
StructTextLength.codepage := CP_ACP;
// ...и пишем ее в память процесса
if not WriteProcessMemory(ProcessHandle, PStructTextLength,
@StructTextLength, SizeOf(TGetTextLengthEx),
BytesWriten) then RaiseLastOSError;
if BytesWriten <> SizeOf(TGetTextLengthEx) then RaiseLastOSError;
// Отправляем сообщение удаленному RichEdit,
// чтобы узнать необходимый размер буффера
RichEditTextLength := SendMessage(RichEditWHandle,
EM_GETTEXTLENGTHEX , Integer(PStructTextLength), 0);
finally
// Освобождаем выделенную под TGetTextLengthEx память
VirtualFreeEx(ProcessHandle, PStructTextLength, 0, MEM_RELEASE);
end;
// Выделяем память под структуру TGetTextEx
PStructTextEx := VirtualAllocEx(ProcessHandle, nil,
SizeOf(TGetTextEx), MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
if PStructTextEx = nil then RaiseLastOSError;
try
// Подготавливаем структуру...
ZeroMemory(@StructTextEx, SizeOf(TGetTextEx));
StructTextEx.flags := GT_USECRLF;
StructTextEx.cb := RichEditTextLength;
// ...и пишем ее в память процесса
if not WriteProcessMemory(ProcessHandle, PStructTextEx,
@StructTextEx, SizeOf(TGetTextEx),
BytesWriten) then RaiseLastOSError;
if BytesWriten <> SizeOf(TGetTextEx) then RaiseLastOSError;
// Выделяем память под текстовый буффер
PTextBuffer := VirtualAllocEx(ProcessHandle, nil,
RichEditTextLength, MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
if PTextBuffer = nil then RaiseLastOSError;
try
// отправляем сообщение
SendMessage(RichEditWHandle, EM_GETTEXTEX, Integer(PStructTextEx),
Integer(PTextBuffer));
// Читаем, то, что у нас скопировалось
SetLength(TextBuffer, RichEditTextLength);
if not ReadProcessMemory(ProcessHandle, PTextBuffer, @TextBuffer[0],
RichEditTextLength, BytesWriten) then RaiseLastOSError;
Memo1.Text := String(TextBuffer);
finally
// Освобождаем выделенную под тестовый буффер память
VirtualFreeEx(ProcessHandle, PTextBuffer, 0, MEM_RELEASE);
end;
finally
// Освобождаем выделенную под TGetTextEx память
VirtualFreeEx(ProcessHandle, PStructTextEx, 0, MEM_RELEASE);
end;
finally
// Закрываем процесс
CloseHandle(ProcessHandle);
end;
end;
end.
← →
ekap (2007-03-22 17:48) [8]Я нашел пример который отображает выбраную строку в SysTreeView32.
Мне кажется там нужно минимальное количество дороботок. Когда появится свободное время посмотри плз.
Твой пример сейчас посмотрю. Хорошо хоть с коментариями не на китайском как половина всего на эту тему.
function GetTreeSelectText(const TreeHand: HWND): String;
var
hCurItem: HTREEITEM;
lNodeText: String;
ltvItem: TTVItem;
h: HWND;
C, i: integer;
Buff: PChar;
S: array[0..1024] of char;
PID: THandle;
PRC: THandle;
R: Cardinal;
begin
Result := "";
hCurItem := HTREEITEM(SendMessage( TreeHand, TVM_GETNEXTITEM, TVGN_CARET, 0 ));
if (hCurItem = nil) then Exit;
GetWindowThreadProcessId(TreeHand, @PID);
PRC := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, PID);
Buff := VirtualAllocEx(PRC, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
FillChar(ltvItem, SizeOf(ltvItem), 0);
with ltvItem do
begin
mask := TVIF_TEXT;
hItem := hCurItem;
cchTextMax := 2048;
pszText := PChar(integer(Buff) + SizeOf(ltvItem) * 4);
end;
WriteProcessMemory(PRC, Buff, @ltvItem, Sizeof(ltvItem), R);
SendMessage(TreeHand, TVM_GETITEM, 0, LongInt(Buff));
ReadProcessMemory(PRC, Buff, @ltvItem, Sizeof(ltvItem), R);
ReadProcessMemory(PRC, PChar(integer(Buff) + SizeOf(ltvItem) * 4), @S[0], SizeOf(S), R);
Result := Trim(S);
VirtualFreeEx(PRC, Buff, 0, MEM_RELEASE);
CloseHandle(PRC);
end;
← →
ekap (2007-03-23 09:48) [9]Может у кого-нибудь есть статья в которой описано подробно на примере подобного окна.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c