为什么TVM_GETITEM取不到数据?

kusosa 2023-08-24 20:07:50

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.StdCtrls, Winapi.CommCtrl;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

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: NativeUInt;
  I: Integer;
  vItem: TTVItemEx;
  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));//不论是哪个,memo都取不到

      //SendMessagea(mHandle, TVM_GETITEMa, 0, lparam(vPointer));//不论是哪个,memo都取不到
      //SendMessagew(mHandle, TVM_GETITEMw 0, lparam(vPointer));//不论是哪个,memo都取不到
      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 }


procedure TForm1.Button1Click(Sender: TObject);
begin
   GetTreeViewText(200246, Memo1.Lines);//数字为注册表systreeview32句柄
end;

end.

 

这问题出在哪里,烦请大神予以帮助,非常感谢。

环境为win10+delphi10 seattle

...全文
195 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
代码下载地址: https://pan.quark.cn/s/a4b39357ea24 图书馆系统非常适合运用C++面向对象的特性进行建模。图书馆管理系统主要由四个关键模块构成:图书借阅、图书归还、图书维护以及读者服务。在系统设计中,可以定义一个读者类(Reader),用于存储每位读者的详细资料;读者数据库类(Rdatabase),用于管理所有读者的信息;图书类(Book),用于记录每本图书的基本属性;图书数据库类(Bdatabase),用于维护所有图书的记录。 【图书馆管理系统构建】 基于C++面向对象编程的图书馆管理系统,其核心功能划分为四个主要部分:图书借阅、图书归还、图书维护和读者服务。该系统通过设计多种类来模拟图书馆的实际运作,包括读者类(Reader)、读者数据库类(Rdatabase)、图书类(Book)以及图书数据库类(Bdatabase)。 1. **读者类(Reader)**: - 该类包含读者的基础资料,例如删除标记(tag)、读者编号(no)、姓名(name)以及所借图书列表(borbook)。 - 通过构造函数对读者信息进行初始化。 - 拷贝构造函数用于复制读者的姓名信息。 - 提供一系列成员函数,以支持信息的获和设置操作。 2. **读者数据库类(Rdatabase)**: - 包含一个读者记录数组(read),并使用记录指针(top)来标识最新添加的读者信息。 - 构造函数从read.txt文件中加载所有读者数据,并在析构函数中将未删除的记录保存回文件。 - 提供管理读者信息的接口,例如添加、删除和查找功能。 3. **图书类(Book)**: - 该类存储图书的基本属性,包括删除标记、图书编号、书名(name)以及图书的在架状态...

5,943

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧