我用 LVM_GETITEMTEXT 无法得到文本。但是用LVM_GETITEMTEXT 却可以得到item的个数。多谢各位!!

解决方案 »

  1.   

    更正 “但是用  LVM_GETITEMCOUNT  却可以得到item的个数”
      

  2.   

    确信目标程序使用了windows标准的通用控件?
      

  3.   

    to codewarrior(会思考的草) :
    用  LVM_GETITEMCOUNT  可以得到item的个数,是不是说明它是标准的?
    另外,我观察他的 window class string ,和 VC 资源编辑器里面 list ctrl 的 window class string 是一样的。
      

  4.   

    flyelf(空谷清音)  : 我也怀疑我穿过去的指针,那边不认识。请教 “跨进城的方式” 应该怎么做?
      

  5.   

    在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;
    }
      

  6.   

    共享内在WINDOWS应该是不认改的呀.没权限
      

  7.   

    发送LVM_GETITEMTEXT消息时,需要为LPARAM参数传递LVITEM 结构的地址。由于跨进程,无法保证接收消息的进程能够使用。
    为了获取某进程中ListCtrl的Item内容,须将代码插入该进程,才能确保将LVM_GETITEMTEXT
    消息成功地发送到list ctrl控件中。注意:可以跨越进程的边界发送窗口消息,以便与内置控件(如按钮、编辑框、静态框等)进行交互操作,但是,对一些新的常用控件不能这样做。具体方法请参见WINDOWS核心编程(Programming Applications for Windows)第22章3小节,实现理论、方法都值得学习。
      

  8.   

    多谢 zgce(牧童),已经搞定.
    同时也感谢其他同学的热情帮助!!