我想取别的程序窗口中的TTreeView中的节点的文本,如何才能取到??请想想办法,急

解决方案 »

  1.   

    //from
    http://dev.csdn.net/develop/article/26/26109.shtm(*//
    标题:获取其他进程中TreeView的文本
    说明:Window2000+Delphi6调试通过
    设计:Zswang
    支持:[email protected]
    日期:2004-03-26
    //*)function TreeNodeGetNext(mHandle: THandle; mTreeItem: HTreeItem): HTreeItem;
    var
      vParentID: HTreeItem;
    begin
      Result := nil;
      if (mHandle <> 0) and (mTreeItem <> nil) then begin
        Result := TreeView_GetChild(mHandle, mTreeItem);
        if Result = nil then
          Result := TreeView_GetNextSibling(mHandle, mTreeItem);
        vParentID := mTreeItem;
        while (Result = nil) and (vParentID <> nil) do begin
          vParentID := TreeView_GetParent(mHandle, vParentID);
          Result := TreeView_GetNextSibling(mHandle, vParentID);
        end;
      end;
    end;  { TreeNodeGetNext }function TreeNodeGetLevel(mHandle: THandle; mTreeItem: HTreeItem): Integer;
    var
      vParentID: HTreeItem;
    begin
      Result := -1;
      if (mHandle <> 0) and (mTreeItem <> nil) then begin
        vParentID := mTreeItem;
        repeat
          Inc(Result);
          vParentID := TreeView_GetParent(mHandle, vParentID);
        until vParentID = nil;
      end;
    end; { TreeNodeGetLevel }function GetTreeViewText(mHandle: THandle; mStrings: TStrings): Boolean;
    var
      vItemCount: Integer;
      vBuffer: array[0..255] of Char;
      vProcessId: DWORD;
      vProcess: THandle;
      vPointer: Pointer;
      vNumberOfBytesRead: Cardinal;
      I: Integer;
      vItem: TTVItem;
      vTreeItem: HTreeItem;
    begin
      Result := False;
      if not Assigned(mStrings) then Exit;
      GetWindowThreadProcessId(mHandle, @vProcessId);
      vProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or
        PROCESS_VM_WRITE, False, vProcessId);
      vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT,
        PAGE_READWRITE);
      mStrings.BeginUpdate;
      try
        mStrings.Clear;
        vItemCount := TreeView_GetCount(mHandle);
        vTreeItem := TreeView_GetRoot(mHandle);
        for I := 0 to vItemCount - 1 do begin
          with vItem do begin
            mask := TVIF_TEXT;
            cchTextMax := SizeOf(vBuffer);
            pszText := Pointer(Cardinal(vPointer) + SizeOf(vItem));
            hItem := vTreeItem;
          end;
          WriteProcessMemory(vProcess, vPointer, @vItem,
            SizeOf(vItem), vNumberOfBytesRead);
          SendMessage(mHandle, TVM_GETITEM, 0, lparam(vPointer));
          ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),
            @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);
          mStrings.Add(StringOfChar(#9, TreeNodeGetLevel(mHandle, vTreeItem)) + vBuffer);
          vTreeItem := TreeNodeGetNext(mHandle, vTreeItem);
        end;
      finally
        VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
        CloseHandle(vProcess);
        mStrings.EndUpdate;
      end;
      Result := True;
    end; { GetTreeViewText }//Example
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      RegisterHotKey(Handle, 1, MOD_WIN, VK_F2);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      UnRegisterHotKey(Handle, 1);
    end;procedure TForm1.WMHOTKEY(var Msg: TWMHOTKEY);
    begin
      case Msg.HotKey of
        1:
          GetTreeViewText(
            WindowFromPoint(Point(Mouse.CursorPos.X, Mouse.CursorPos.Y)),
            MemoText.Lines);
      end;
    end;