[转帖]如何获取另一个进程的List Ctrl Item Text

作者在 2009-02-15 20:54:03 发布以下内容
#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;
}

---------------------------------------------------------------


发送LVM_GETITEMTEXT消息时,需要为LPARAM参数传递LVITEM 结构的地址。由于跨进程,无法保证接收消息的进程能够使用。
为了获取某进程中ListCtrl的Item内容,须将代码插入该进程,才能确保将LVM_GETITEMTEXT
消息成功地发送到list ctrl控件中。

注意:可以跨越进程的边界发送窗口消息,以便与内置控件(如按钮、编辑框、静态框等)进行交互操作,但是,对一些新的常用控件不能这样做。

具体方法请参见WINDOWS核心编程(Programming Applications for Windows)第22章3小节,实现理论、方法都值得学习。
vc | 阅读 2503 次
文章评论,共0条
游客请输入验证码