SysListView32类SysListView32的内容如何取出?

liutian2 2010-03-21 06:33:53
谢谢 希望提供BAIDU关键字或者文章链接
如有函数不胜感激
...全文
469 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
liutian2 2010-04-01
  • 打赏
  • 举报
回复
才发现 目标控件的 LVS_OWNERDATA 也设定了
其他的没有设定这个属性的 可以读出
liutian2 2010-04-01
  • 打赏
  • 举报
回复
奇怪 读不出来啊、、、、、
不知道哪里错了 郁闷啊
liutian2 2010-04-01
  • 打赏
  • 举报
回复
呵呵 谢谢理解 单位最近上ERP 忙的和狗一样
私活都没时间做了
到不是心疼分
主要是怕有了问题 在开贴找不到高手问
sanguomi 2010-03-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 liutian2 的回复:]
啊 7楼的 可以啊 这几天实验下
成功一定给分 7楼不要着急
[/Quote]

我急什么,分又不能当饭吃,又不能买房,呵呵
不过是没事上来看下
liutian2 2010-03-28
  • 打赏
  • 举报
回复
啊 7楼的 可以啊 这几天实验下
成功一定给分 7楼不要着急
liutian2 2010-03-27
  • 打赏
  • 举报
回复
设置了 ownerdata 的 SysListView32类 的 list
无条件为你 2010-03-27
  • 打赏
  • 举报
回复
7楼的方法可以,只不过只能读取一列。如果你想完美读取,加点分我给你写完整代码,否则你就用7楼的吧。
sanguomi 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 liutian2 的回复:]
是 ownerdata 的 6楼的美实验过
7楼的好像只能读普通的吗?
[/Quote]

你是读哪里的?
liutian2 2010-03-24
  • 打赏
  • 举报
回复
顶起顶起顶起顶起顶起顶起顶起顶起顶起顶起顶起顶起顶起顶起顶起顶起顶起顶起顶起
liutian2 2010-03-23
  • 打赏
  • 举报
回复
没有新答案吗?
liutian2 2010-03-22
  • 打赏
  • 举报
回复
是 ownerdata 的 6楼的美实验过
7楼的好像只能读普通的吗?
sanguomi 2010-03-22
  • 打赏
  • 举报
回复

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;
SQLDebug_Fan 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cnzdgs 的回复:]
用FindWindow、FindWindowEx等得到控件句柄,通过SendMessage发消息来获取。
因为各个进程的虚拟地址空间是相互独立的,所以SendMessage传递数据的内存必须在目标窗口所属进程中分配。可以用GetWindowThreadProcessId获得进程ID,OpenProcess、VirtualAllocEx在目标进程中分配内存,用ReadProcessMemory、W……
[/Quote]
cnzdgs 2010-03-22
  • 打赏
  • 举报
回复
用FindWindow、FindWindowEx等得到控件句柄,通过SendMessage发消息来获取。
因为各个进程的虚拟地址空间是相互独立的,所以SendMessage传递数据的内存必须在目标窗口所属进程中分配。可以用GetWindowThreadProcessId获得进程ID,OpenProcess、VirtualAllocEx在目标进程中分配内存,用ReadProcessMemory、WriteProcessMemory在进程间复制数据,最后再VirtualFreeEx释放内存。
亮剑_ 2010-03-21
  • 打赏
  • 举报
回复
研究一下Spy++
liutian2 2010-03-21
  • 打赏
  • 举报
回复
而且是 ownerdata 的、、、、、
SQLDebug_Fan 2010-03-21
  • 打赏
  • 举报
回复
不会,期待大牛出现
liutian2 2010-03-21
  • 打赏
  • 举报
回复
又 忘了说 vsReport 的
liutian2 2010-03-21
  • 打赏
  • 举报
回复
忘了说了 是其他程序的。。。。。。。。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧