多谢各位!!
15 个解决方案
#1
更正 “但是用 LVM_GETITEMCOUNT 却可以得到item的个数”
#2
#3
确信目标程序使用了windows标准的通用控件?
#4
需要使用跨进城的方式,否则目标进程不认这个地址
#5
to codewarrior(会思考的草) :
用 LVM_GETITEMCOUNT 可以得到item的个数,是不是说明它是标准的?
另外,我观察他的 window class string ,和 VC 资源编辑器里面 list ctrl 的 window class string 是一样的。
用 LVM_GETITEMCOUNT 可以得到item的个数,是不是说明它是标准的?
另外,我观察他的 window class string ,和 VC 资源编辑器里面 list ctrl 的 window class string 是一样的。
#6
flyelf(空谷清音) : 我也怀疑我穿过去的指针,那边不认识。请教 “跨进城的方式” 应该怎么做?
#7
在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;
}
#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;
}
#8
用共享内存就可以接收。
#9
#10
我是说用文件映射的方式创建一块共享内存区。
#11
恩
有难度
有难度
#12
共享内在WINDOWS应该是不认改的呀.没权限
#13
发送LVM_GETITEMTEXT消息时,需要为LPARAM参数传递LVITEM 结构的地址。由于跨进程,无法保证接收消息的进程能够使用。
为了获取某进程中ListCtrl的Item内容,须将代码插入该进程,才能确保将LVM_GETITEMTEXT
消息成功地发送到list ctrl控件中。
注意:可以跨越进程的边界发送窗口消息,以便与内置控件(如按钮、编辑框、静态框等)进行交互操作,但是,对一些新的常用控件不能这样做。
具体方法请参见WINDOWS核心编程(Programming Applications for Windows)第22章3小节,实现理论、方法都值得学习。
为了获取某进程中ListCtrl的Item内容,须将代码插入该进程,才能确保将LVM_GETITEMTEXT
消息成功地发送到list ctrl控件中。
注意:可以跨越进程的边界发送窗口消息,以便与内置控件(如按钮、编辑框、静态框等)进行交互操作,但是,对一些新的常用控件不能这样做。
具体方法请参见WINDOWS核心编程(Programming Applications for Windows)第22章3小节,实现理论、方法都值得学习。
#14
多谢 zgce(牧童),已经搞定.
同时也感谢其他同学的热情帮助!!
同时也感谢其他同学的热情帮助!!
#15
UP
#1
更正 “但是用 LVM_GETITEMCOUNT 却可以得到item的个数”
#2
#3
确信目标程序使用了windows标准的通用控件?
#4
需要使用跨进城的方式,否则目标进程不认这个地址
#5
to codewarrior(会思考的草) :
用 LVM_GETITEMCOUNT 可以得到item的个数,是不是说明它是标准的?
另外,我观察他的 window class string ,和 VC 资源编辑器里面 list ctrl 的 window class string 是一样的。
用 LVM_GETITEMCOUNT 可以得到item的个数,是不是说明它是标准的?
另外,我观察他的 window class string ,和 VC 资源编辑器里面 list ctrl 的 window class string 是一样的。
#6
flyelf(空谷清音) : 我也怀疑我穿过去的指针,那边不认识。请教 “跨进城的方式” 应该怎么做?
#7
在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;
}
#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;
}
#8
用共享内存就可以接收。
#9
#10
我是说用文件映射的方式创建一块共享内存区。
#11
恩
有难度
有难度
#12
共享内在WINDOWS应该是不认改的呀.没权限
#13
发送LVM_GETITEMTEXT消息时,需要为LPARAM参数传递LVITEM 结构的地址。由于跨进程,无法保证接收消息的进程能够使用。
为了获取某进程中ListCtrl的Item内容,须将代码插入该进程,才能确保将LVM_GETITEMTEXT
消息成功地发送到list ctrl控件中。
注意:可以跨越进程的边界发送窗口消息,以便与内置控件(如按钮、编辑框、静态框等)进行交互操作,但是,对一些新的常用控件不能这样做。
具体方法请参见WINDOWS核心编程(Programming Applications for Windows)第22章3小节,实现理论、方法都值得学习。
为了获取某进程中ListCtrl的Item内容,须将代码插入该进程,才能确保将LVM_GETITEMTEXT
消息成功地发送到list ctrl控件中。
注意:可以跨越进程的边界发送窗口消息,以便与内置控件(如按钮、编辑框、静态框等)进行交互操作,但是,对一些新的常用控件不能这样做。
具体方法请参见WINDOWS核心编程(Programming Applications for Windows)第22章3小节,实现理论、方法都值得学习。
#14
多谢 zgce(牧童),已经搞定.
同时也感谢其他同学的热情帮助!!
同时也感谢其他同学的热情帮助!!
#15
UP