如何利用Win32API取得另一支程式中的ListView內的所有值

简介: unit GetListViewDatas;interfaceuses  Windows, Messages, SysUtils, CommCtrl, Variants, Classes, Graphics, Controls, Forms,  ...

unit GetListViewDatas;

interface

uses
  Windows, Messages, SysUtils, CommCtrl, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TFormGetListViewDatas = class(TForm)
    mmoText: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    procedure WMHOTKEY(var Msg: TWMHOTKEY); message WM_HOTKEY;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormGetListViewDatas: TFormGetListViewDatas;

implementation

{$R *.dfm}

function ListViewColumnCount(mHandle: THandle): Integer;  
begin 
  Result := Header_GetItemCount(ListView_GetHeader(mHandle));  
end;

function GetListViewSelectText(mHandle: THandle;var mStrings: string): Boolean;  
var 
  vColumnCount: Integer;
  I, J: Integer;
  vBuffer: array[0..255] of Char;  
  vProcessId: DWORD;  
  vProcess: THandle;  
  vPointer: Pointer;  
  vNumberOfBytesRead: Cardinal;  
  vItem: TLVItem;
begin 
  Result := False;  
  I := ListView_GetNextItem(mHandle, -1, LVNI_SELECTED);  
  if I = -1 then 
    Exit;  

  vColumnCount := ListViewColumnCount(mHandle);  
  if vColumnCount <= 0 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);  

  try
    mStrings := '';  
    for J := 0 to vColumnCount - 1 do 
    begin 
      with vItem do 
      begin 
        mask := LVIF_TEXT;  
        iItem := I;  
        iSubItem := J;  
        cchTextMax := SizeOf(vBuffer);  
        pszText := Pointer(Cardinal(vPointer) + SizeOf(TLVItem));  
      end;  
      WriteProcessMemory(vProcess, vPointer, @vItem,  
        SizeOf(TLVItem), vNumberOfBytesRead);  
      SendMessage(mHandle, LVM_GETITEM, I, lparam(vPointer));  
      ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),  
        @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);  
      mStrings := mStrings + #9 + vBuffer;  
    end;  
  finally 
    VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);  
    CloseHandle(vProcess);
  end;  
  Result := True;  
end;

function GetListViewText(mHandle: THandle; mStrings: TStrings): Boolean;  
var 
  vColumnCount: Integer;  
  vItemCount: Integer;  
  I, J: Integer;  
  vBuffer: array[0..255] of Char;  
  vProcessId: DWORD;  
  vProcess: THandle;  
  vPointer: Pointer;  
  vNumberOfBytesRead: Cardinal;  
  S: string;  
  vItem: TLVItem;  
begin 
  Result := False;  
  if not Assigned(mStrings) then Exit;  
  vColumnCount := ListViewColumnCount(mHandle);  
  if vColumnCount <= 0 then Exit;  
  vItemCount := ListView_GetItemCount(mHandle);  
  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;  
    for I := 0 to vItemCount - 1 do begin 
      S := '';  
      for J := 0 to vColumnCount - 1 do begin 
        with vItem do begin 
          mask := LVIF_TEXT;  
          iItem := I;  
          iSubItem := J;  
          cchTextMax := SizeOf(vBuffer);  
          pszText := Pointer(Cardinal(vPointer) + SizeOf(TLVItem));  
        end;  
        WriteProcessMemory(vProcess, vPointer, @vItem,  
          SizeOf(TLVItem), vNumberOfBytesRead);  
        SendMessage(mHandle, LVM_GETITEM, I, lparam(vPointer));  
        ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),  
          @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);  
        S := S + #9 + vBuffer;  
      end;  
      Delete(S, 1, 1);  
      mStrings.Add(S);  
    end;  
  finally 
    VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);  
    CloseHandle(vProcess);  
    mStrings.EndUpdate;  
  end;  
  Result := True;  
end;

procedure TFormGetListViewDatas.FormCreate(Sender: TObject);
begin
  RegisterHotKey(Handle, 1, MOD_WIN, VK_F3);
end;

procedure TFormGetListViewDatas.WMHOTKEY(var Msg: TWMHOTKEY);
begin
  case Msg.HotKey of
    1:
      GetListViewText(
        WindowFromPoint(Point(Mouse.CursorPos.X, Mouse.CursorPos.Y)),
        mmoText.Lines);
  end;  
end;

procedure TFormGetListViewDatas.FormDestroy(Sender: TObject);
begin
  UnRegisterHotKey(Handle, 1);
end;

end.

相关文章
|
5月前
|
API Android开发 开发者
`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView
【6月更文挑战第26天】`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView。它提供高效的数据视图复用,优化的布局管理,支持多种布局(如线性、网格),并解耦数据、适配器和视图。RecyclerView的灵活性、性能(如局部刷新和动画支持)和扩展性使其成为现代Android开发的首选,特别是在处理大规模数据集时。
66 2
|
前端开发 API Android开发
|
Web App开发 JSON API
Xamarin android 调用Web Api(ListView使用远程数据)
xamarin android如何调用sqlserver 数据库呢(或者其他的),很多新手都会有这个疑问。xamarin android调用远程数据主要有两种方式: 在Android中保存数据或调用数据库可以利用SQLite,android中提供了几个类来管理SQLite数据库,对数据进行增删改查 直接调用Asp.net Web API对数据进行增删改查 这两种方式到底选择哪一种方式好一点呢?哪一种方式好不好我不敢确定,市场上大部分app都是调用api来clud的。
1363 0
|
前端开发 API Android开发
|
12天前
|
JSON API 数据格式
淘宝 / 天猫官方商品 / 订单订单 API 接口丨商品上传接口对接步骤
要对接淘宝/天猫官方商品或订单API,需先注册淘宝开放平台账号,创建应用获取App Key和App Secret。之后,详细阅读API文档,了解接口功能及权限要求,编写认证、构建请求、发送请求和处理响应的代码。最后,在沙箱环境中测试与调试,确保API调用的正确性和稳定性。
|
25天前
|
供应链 数据挖掘 API
电商API接口介绍——sku接口概述
商品SKU(Stock Keeping Unit)接口是电商API接口中的一种,专门用于获取商品的SKU信息。SKU是库存量单位,用于区分同一商品的不同规格、颜色、尺寸等属性。通过商品SKU接口,开发者可以获取商品的SKU列表、SKU属性、库存数量等详细信息。
|
26天前
|
JSON API 数据格式
店铺所有商品列表接口json数据格式示例(API接口)
当然,以下是一个示例的JSON数据格式,用于表示一个店铺所有商品列表的API接口响应
|
1月前
|
编解码 监控 API
直播源怎么调用api接口
调用直播源的API接口涉及开通服务、添加域名、获取API密钥、调用API接口、生成推流和拉流地址、配置直播源、开始直播、监控管理及停止直播等步骤。不同云服务平台的具体操作略有差异,但整体流程简单易懂。
|
16天前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
|
1月前
|
人工智能 自然语言处理 PyTorch
Text2Video Huggingface Pipeline 文生视频接口和文生视频论文API
文生视频是AI领域热点,很多文生视频的大模型都是基于 Huggingface的 diffusers的text to video的pipeline来开发。国内外也有非常多的优秀产品如Runway AI、Pika AI 、可灵King AI、通义千问、智谱的文生视频模型等等。为了方便调用,这篇博客也尝试了使用 PyPI的text2video的python库的Wrapper类进行调用,下面会给大家介绍一下Huggingface Text to Video Pipeline的调用方式以及使用通用的text2video的python库调用方式。
下一篇
无影云桌面