這個是我的代碼,仿網上的C++版本寫的, 但不是知道錯在哪里
就是讀取不到資料,哪位大神幫我研究一下
procedure TForm1.btn1Click(Sender: TObject);
var
whwnd,hlistview:HWND;
headerhwnd:Integer;
rows,cols:Integer;
ThreadID:DWORD;
ProcessID:DWORD;
hProcess:THandle;
p_lvitem:^TLVItem;
tmplvitem:TLVItem;
i,j:Integer;
pItem:LPTSTR;
ptr:DWORD;
ItemBuf:array [0..511] of Char;
OutSize,WriteSize:DWORD;
s:string;
begin
whwnd:=FindWindow('#32770','Windows 任務管理器');
whwnd:=FindWindowEx(whwnd,0,'#32770',nil);
hlistview:=FindWindowEx(whwnd,0,'SysListView32',nil);
// ShowMessage(IntToStr(hlistview));
//總行數:行程的數量
rows:=SendMessage(hListview,LVM_GETITEMCOUNT,0,0);
//串列列數
headerhwnd := SendMessage(hListview,LVM_GETHEADER, 0, 0); //listview的列頭句柄
cols:=SendMessage(headerhwnd, HDM_GETITEMCOUNT,0,0);
ThreadID:=GetWindowThreadProcessId(hListview,@ProcessID);
//打開并插入行程
hProcess:=OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION, FALSE,ProcessID);
//申請代碼的記憶體區
p_lvitem:=VirtualAllocEx(hProcess,nil, SizeOf(TLVITEM),MEM_COMMIT, PAGE_READWRITE);
GetMem(p_lvitem,SizeOf(TLVITEM));
for i:=0 to rows-1 do
begin
for j:=0 to cols-1 do
begin
tmplvitem.mask:=LVIF_TEXT;
tmplvitem.iItem:=i;
tmplvitem.iSubItem:=j;
tmplvitem.cchTextMax:=512;
pItem:=nil;
pItem:=LPSTR(VirtualAllocEx(hProcess, nil, 512, MEM_COMMIT, PAGE_READWRITE));
tmplvitem.pszText:=pItem;
WriteProcessMemory(hProcess , p_lvitem,@tmplvitem, sizeof(tmplvitem),WriteSize);
SendMessage(hListview, LVM_GETITEMW,i,Integer(p_lvitem));
ZeroMemory(@ItemBuf,512);
ReadProcessMemory(hProcess, pItem, @ItemBuf, 512, OutSize);
s:= s+ ' ' + ItemBuf;
VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
end;
mmo1.Lines.Add(s);
end;
VirtualFreeEx(hProcess, p_lvitem, 0, MEM_RELEASE)
CloseHandle(hProcess);//關閉打開的行程物件
end;
uj5u.com熱心網友回復:
你至少貼出個完整的代碼啊,編譯都不過。uj5u.com熱心網友回復:
前幾天除錯過win7 64下成功uj5u.com熱心網友回復:
樓上的成功了?能不能賜教一下uj5u.com熱心網友回復:
這是我現用的程式代碼,能用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);
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 }
//button里加這句話,memo里就能有listview的內容了
GetListViewText(listview的句柄,MemoText.Lines);
uj5u.com熱心網友回復:
對了,上面的代碼需要參考CommCtrluj5u.com熱心網友回復:
非常感謝,正是我需要的轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/59099.html
