SysListView32类SysListView32的内容如何取出? 谢谢 希望提供BAIDU关键字或者文章链接如有函数不胜感激 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 又 忘了说 vsReport 的 而且是 ownerdata 的、、、、、 用FindWindow、FindWindowEx等得到控件句柄,通过SendMessage发消息来获取。因为各个进程的虚拟地址空间是相互独立的,所以SendMessage传递数据的内存必须在目标窗口所属进程中分配。可以用GetWindowThreadProcessId获得进程ID,OpenProcess、VirtualAllocEx在目标进程中分配内存,用ReadProcessMemory、WriteProcessMemory在进程间复制数据,最后再VirtualFreeEx释放内存。 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; 是 ownerdata 的 6楼的美实验过7楼的好像只能读普通的吗? 设置了 ownerdata 的 SysListView32类 的 list 呵呵 谢谢理解 单位最近上ERP 忙的和狗一样私活都没时间做了到不是心疼分主要是怕有了问题 在开贴找不到高手问 才发现 目标控件的 LVS_OWNERDATA 也设定了其他的没有设定这个属性的 可以读出 为什么服务运行后无法关机 查看变量的内存地址 请教个问题,在程序里面如何实现Acess数据库的备份和恢复。 不同级别用户有不同的使用权限,请指教…… 关于 bulid compile 的问题 紧急求助ClientSocket 读取数据问题 如何控制Dbgrid1中的第1、2、3列为只读,第4列为可写呢? 结婚了,请大家参加我的婚礼 请问如何交换StringGrid中的指定行和列,是使用编码的方式不是设置属性! 高分求助 用api代替TSimpleEvent不知道为什么没有效果 大家帮我看看这段代码错在那里
因为各个进程的虚拟地址空间是相互独立的,所以SendMessage传递数据的内存必须在目标窗口所属进程中分配。可以用GetWindowThreadProcessId获得进程ID,OpenProcess、VirtualAllocEx在目标进程中分配内存,用ReadProcessMemory、WriteProcessMemory在进程间复制数据,最后再VirtualFreeEx释放内存。
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;
7楼的好像只能读普通的吗?
私活都没时间做了
到不是心疼分
主要是怕有了问题 在开贴找不到高手问
其他的没有设定这个属性的 可以读出