为什么TVM_GETITEM取不到数据?

kusosa kusosa 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

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

...全文

相关推荐

遍历和查找外部程序 Tree-View 中的项目 文档

遍历和查找外部程序 Tree-View 中的项目 遍历和查找外部程序 Tree-View 中的项目 遍历和查找外部程序 Tree-View 中的项目

痞子小王

SendMessage函数巧应用3

SendMessage函数巧应用3SendMessage函数巧应用3SendMessage函数巧应用3SendMessage函数巧应用3

abb0120

Microsoft.WinDbg-1.2610.1001.0-x64

Microsoft.WinDbg-1.2610.1001.0-x64

CSUer丶夜神゛

Claude 代码超强能力:核心技能库

Superpowers 是一套面向你的编码智能体的完整软件开发方法论,由一组可组合技能和若干初始指令构建而成,用以确保智能体真正使用这些技能。

yiersansiwu123d

PDF发票内容提取排版并结构化导出xlsx/cvs嵌入式ptyhon

【本地发票提取工具】 核心优势:不依赖传统粗糙 OCR,基于文字排版结构进行精准提取。仅“税网”下载及税网邮件发送的原版 PDF 发票(开票软件发送的不太支持)能实现开票明细级的秒级本地提取,告别只能提抬头、总额的尴尬。 可免费试用 3 天! 【用前须知】 去微软官网下载VC_redist.x64.exe运行修复运行库(必要的前置操作),之后再解压本工具rar,运行本exe即可。 VC_redist.x64.exe官网永久下载地址 https://learn.microsoft.com/zh-cn/cpp/windows/latest-supported-vc-redist 【安全须知】 个人开发暂未做代码签名,杀软可能会有误报拦截。遇到拦截请在杀软中添加信任/白名单即可。 VirusTotal扫描结果 2/61,主流杀软均通过,个别引擎因无签名误报。官网 virustotal.com 点击页面中间显眼的 “Choose file”(选择文件)按钮上传扫描。

信人远邮168
评论
收藏 已收藏
分享
返回顶部
kusosa
Delphi 5,944 成员 262,941 内容