1,183
社区成员
发帖
与我相关
我的任务
分享
uses
CommCtrl;
function ListView_GetItemText_Ex(hwndLV: HWND; i, iSubItem: Integer;
pszText: PChar; cchTextMax: Integer): Integer;
var
LVItem: TLVItem;
ProcessID, ProcessHD, Temp: DWORD;
MemPoint: Pointer;
begin
GetWindowThreadProcessId(hwndLV, ProcessID);
ProcessHD := OpenProcess(
PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE,
FALSE, ProcessID);
MemPoint := VirtualAllocEx(ProcessHD, nil, SizeOf(TLVItem) + cchTextMax,
MEM_COMMIT, PAGE_READWRITE);
LVItem.iSubItem := iSubItem;
LVItem.cchTextMax := cchTextMax;
LVItem.pszText := PChar(Integer(MemPoint) + SizeOf(TLVItem));
WriteProcessMemory(ProcessHD, MemPoint, @LVItem, SizeOf(TLVItem), Temp);
Result := SendMessage(hwndLV, LVM_GETITEMTEXT, i, Integer(MemPoint));
ReadProcessMemory(ProcessHD, Pointer(Integer(MemPoint) + SizeOf(TLVItem)),
pszText, cchTextMax, Temp);
VirtualFreeEx(ProcessHD, MemPoint, SizeOf(TLVItem) + cchTextMax,
MEM_DECOMMIT);
VirtualFreeEx(ProcessHD, MemPoint, 0, MEM_RELEASE);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
TextBuffer: array[0..100] of Char;
Count: Integer;
I: Integer;
H: HWND;
begin
H := FindWindow('Progman', 'Program Manager');
H := GetWindow(H, GW_CHILD);
H := GetWindow(H, GW_CHILD);
Count := SendMessage(H, LVM_GETITEMCOUNT, 0, 0);
for I := 0 to Count - 1 do
begin
ListView_GetItemText_Ex(H, i, 0, TextBuffer, 100); //TextBuffer 为桌面内容
Memo1.Lines.Add(TextBuffer);
end;
end;