Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.033 c
9-1084025706
V0id
2004-05-08 18:15
2004.08.22
Sprite


3-1090936502
AlexanderSK
2004-07-27 17:55
2004.08.22
Разрыв коннекта с БД


3-1091013367
don-do
2004-07-28 15:16
2004.08.22
Помогите по коду ошибки получить ее текст из файла Interbas.msg


14-1091605212
Layner
2004-08-04 11:40
2004.08.22
Почему такая дискриминация русского???


3-1090819645
sapsi
2004-07-26 09:27
2004.08.22
особенность работы ADO под WINXP





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