Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
4-1174330969
THE__Scorpion
2007-03-19 22:02
2007.09.09
Память процесса


2-1187180620
r.o.o.t
2007-08-15 16:23
2007.09.09
Передача параметров..


15-1186626194
Slider007
2007-08-09 06:23
2007.09.09
С днем рождения ! 9 августа 2007 четверг


15-1186924736
апр
2007-08-12 17:18
2007.09.09
User Gate


2-1187218781
{RASkov}
2007-08-16 02:59
2007.09.09
Как принудительно обновить размер колонок в ListView?





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