如何利用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.

相关文章
|
前端开发 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的。
1305 0
|
前端开发 API Android开发
|
25天前
|
SQL API Python
Python DB API下规范下cursor对象常用接口
Python DB API下规范下cursor对象常用接口。
19 4
|
1天前
|
JSON 搜索推荐 数据挖掘
电商数据分析的利器:电商关键词搜索API接口(标题丨图片丨价格丨链接)
淘宝关键词搜索接口为电商领域的数据分析提供了丰富的数据源。通过有效利用这一接口,企业和研究人员可以更深入地洞察市场动态,优化营销策略,并提升用户体验。随着电商平台技术的不断进步,未来的API将更加智能和个性化,为电商行业带来更多的可能性。
|
8天前
|
存储 缓存 运维
DataWorks操作报错合集之DataWorks根据api,调用查询文件列表接口报错如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
20 1
|
9天前
|
SQL 数据管理 API
数据管理DMS产品使用合集之阿里云DMS提供API接口来进行数据导出功能吗
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
9天前
|
运维 Serverless API
Serverless 应用引擎产品使用之在阿里函数计算中开启函数计算 API 接口如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
108 6
|
11天前
|
前端开发 Java 测试技术
IDEA 版 API 接口神器来了,一键生成文档,贼香!
IDEA 版 API 接口神器来了,一键生成文档,贼香!
31 0
|
12天前
|
API 开发者
邮件API接口使用的方法和步骤
AOKSEND指南:了解和使用邮件API接口,包括选择适合的接口(如AOKSEND、Mailgun、SMTP),获取访问权限,配置发件人、收件人及邮件内容,调用接口发送邮件,并处理返回结果,以高效集成邮件功能。