获取另外一个进程的list ctrl item text应该如何做? 我用 LVM_GETITEMTEXT 无法得到文本。但是用LVM_GETITEMTEXT 却可以得到item的个数。多谢各位!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 更正 “但是用 LVM_GETITEMCOUNT 却可以得到item的个数” 确信目标程序使用了windows标准的通用控件? to codewarrior(会思考的草) :用 LVM_GETITEMCOUNT 可以得到item的个数,是不是说明它是标准的?另外,我观察他的 window class string ,和 VC 资源编辑器里面 list ctrl 的 window class string 是一样的。 flyelf(空谷清音) : 我也怀疑我穿过去的指针,那边不认识。请教 “跨进城的方式” 应该怎么做? 在Codeproject上有答案的,可以找找,得用WriteProcessMemory() 和 ReadProcessMemory()代码如下:#define WIN32_LEAN_AND_MEAN#include <stdio.h>#include <windows.h>#include <commctrl.h>int main(void) { HWND hwnd=FindWindow(NULL, "Stealing Program's Memory: ListView"); HWND listview=FindWindowEx(hwnd, NULL, "SysListView32", NULL); int count=(int)SendMessage(listview, LVM_GETITEMCOUNT, 0, 0); int i; LVITEM lvi, *_lvi; char item[512], subitem[512]; char *_item, *_subitem; unsigned long pid; HANDLE process; GetWindowThreadProcessId(listview, &pid); process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ| PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid); _lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE); _item=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT, PAGE_READWRITE); _subitem=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT, PAGE_READWRITE); lvi.cchTextMax=512; for(i=0; i<count; i++) { lvi.iSubItem=0; lvi.pszText=_item; WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL); SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi); lvi.iSubItem=1; lvi.pszText=_subitem; WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL); SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi); ReadProcessMemory(process, _item, item, 512, NULL); ReadProcessMemory(process, _subitem, subitem, 512, NULL); printf("%s - %s\n", item, subitem); } VirtualFreeEx(process, _lvi, 0, MEM_RELEASE); VirtualFreeEx(process, _item, 0, MEM_RELEASE); VirtualFreeEx(process, _subitem, 0, MEM_RELEASE); return 0;} 共享内在WINDOWS应该是不认改的呀.没权限 发送LVM_GETITEMTEXT消息时,需要为LPARAM参数传递LVITEM 结构的地址。由于跨进程,无法保证接收消息的进程能够使用。为了获取某进程中ListCtrl的Item内容,须将代码插入该进程,才能确保将LVM_GETITEMTEXT消息成功地发送到list ctrl控件中。注意:可以跨越进程的边界发送窗口消息,以便与内置控件(如按钮、编辑框、静态框等)进行交互操作,但是,对一些新的常用控件不能这样做。具体方法请参见WINDOWS核心编程(Programming Applications for Windows)第22章3小节,实现理论、方法都值得学习。 多谢 zgce(牧童),已经搞定.同时也感谢其他同学的热情帮助!! 做个大华硬盘录像机的流媒体转发服务器,tcp转发,用什么模型比较好,现在是设计阶段 这样定义过后,是不是没有信息输出了? 求助一问题 vc 2010里多了些 MFC 控件? 改变状态条的代码在哪里? 客户区域绘制 移植lwip时,如果把某个tcp的报文放在两个pbuf里,然后就会出现checksum 错误 如何才CFrameWnd得到ONMOUSEMOVE消息 关于视图的问题!!!很急,各位大哥帮帮忙!! 还是关于屏幕拷贝 关于VB中调用DLL中的指针问题 如何得到网页中的邮箱地址
用 LVM_GETITEMCOUNT 可以得到item的个数,是不是说明它是标准的?
另外,我观察他的 window class string ,和 VC 资源编辑器里面 list ctrl 的 window class string 是一样的。
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <windows.h>
#include <commctrl.h>int main(void) {
HWND hwnd=FindWindow(NULL, "Stealing Program's Memory: ListView");
HWND listview=FindWindowEx(hwnd, NULL, "SysListView32", NULL); int count=(int)SendMessage(listview, LVM_GETITEMCOUNT, 0, 0);
int i; LVITEM lvi, *_lvi;
char item[512], subitem[512];
char *_item, *_subitem;
unsigned long pid;
HANDLE process; GetWindowThreadProcessId(listview, &pid);
process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|
PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid); _lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM),
MEM_COMMIT, PAGE_READWRITE);
_item=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,
PAGE_READWRITE);
_subitem=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,
PAGE_READWRITE); lvi.cchTextMax=512; for(i=0; i<count; i++) {
lvi.iSubItem=0;
lvi.pszText=_item;
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi); lvi.iSubItem=1;
lvi.pszText=_subitem;
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi); ReadProcessMemory(process, _item, item, 512, NULL);
ReadProcessMemory(process, _subitem, subitem, 512, NULL); printf("%s - %s\n", item, subitem);
} VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
VirtualFreeEx(process, _item, 0, MEM_RELEASE);
VirtualFreeEx(process, _subitem, 0, MEM_RELEASE); return 0;
}
为了获取某进程中ListCtrl的Item内容,须将代码插入该进程,才能确保将LVM_GETITEMTEXT
消息成功地发送到list ctrl控件中。注意:可以跨越进程的边界发送窗口消息,以便与内置控件(如按钮、编辑框、静态框等)进行交互操作,但是,对一些新的常用控件不能这样做。具体方法请参见WINDOWS核心编程(Programming Applications for Windows)第22章3小节,实现理论、方法都值得学习。
同时也感谢其他同学的热情帮助!!