首页
社区
课程
招聘
[求助]请各大神帮忙,想跨进程取列表框数据,取不得,用spy4winspy也取不到
发表于: 2017-6-11 22:48 2967

[求助]请各大神帮忙,想跨进程取列表框数据,取不得,用spy4winspy也取不到

2017-6-11 22:48
2967


控件名得到了,


程序在百度网盘:http://pan.baidu.com/s/1o8kFr54

我自己懂一点点DELPHI,我没有办法取到数据,现在DELPHI不行了,以前还有个大富翁论坛,可以提问,现在DELPHI不行了,只有在这个来寻求帮助,现在易语言比较火,用易语言做成DLL,dll就一个导出函数,函数就一个参数,如果输入1,就取第一列,如果输入2就取第二列...。

其实DELPHI代码也是在网上找的,现在贴上代码,

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

end; { ListViewColumnCount }

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);
          if  vBuffer='' then
          vBuffer :='0';

        S := S + ',' + 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; { GetListViewText }

procedure TForm1.Timer1Timer(Sender: TObject);
var
  mh,zh,ch: HWND;
  s,S1: String;
  WinText:array[0..255] of char;

begin
    mh:=FindWindow(nil,PChar('要素检查'));
    if mh>0 then
    zh:=FindWindowEx(mh,0,'mgGridCtrl',0);
    if zh> 0 then
    GetListViewText(zh,TmpL);
    mmo1.Text:=tmpl.Text;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  tmpl:=TStringList.Create;
end;


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 62
活跃值: (2052)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
恳请各位援手
2017-6-14 21:55
0
游客
登录 | 注册 方可回帖
返回
//