跨进程获取设置了LVS_OWNERDATA 的SYSLISTVIEW32控件中的数据

解决方案 »

  1.   

    function ListView_GetItemText_Mz(hListView: HWnd; iItem, iSubItem: Integer; pszText: PChar; cchTextMax: Integer): Integer;
    var hProcess: THandle;
      DispInfo: TLVDispInfo;
      ProcessID, ThreadID: DWORD;
      vNumberOfBytesRead: Cardinal;
      vPointer: Pointer;
      pitem: LPWSTR;
      vBuffer: array[0..255] of Char;
    begin
      DispInfo.hdr.hwndFrom := hListView;
      DispInfo.hdr.idFrom := GetDlgCtrlID(hListView);
      DispInfo.hdr.code := LVN_GETDISPINFO;
      ThreadID := GetWindowThreadProcessId(hListview, @ProcessID);
      hProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION, FALSE, ProcessID);
      pItem := VirtualAllocEx(hProcess, nil, 512, MEM_COMMIT, PAGE_READWRITE);
      DispInfo.item.mask := LVIF_TEXT;
      DispInfo.item.iItem := iItem;
      DispInfo.item.iSubItem := iSubItem;
      DispInfo.item.pszText := pszText;
      DispInfo.item.cchTextMax := cchTextMax;
      DispInfo.item.pszText := Pointer(Cardinal(pItem) + SizeOf(TLVDispInfo));
      WriteProcessMemory(hProcess, pItem, @DispInfo, SizeOf(TLVDispInfo), vNumberOfBytesRead);
      Result := SendMessage(GetParent(hListView), WM_NOTIFY, GetDlgCtrlID(hListView), Integer(@DispInfo));
      ReadProcessMemory(hProcess, Pointer(Cardinal(pItem) + SizeOf(TLVDispInfo)),
        @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);
      DispInfo.item.pszText := vBuffer;
      VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
    end;