你如何获得另一个进程窗口上的CListCtrl指针,确认已经正确获得了吗?

解决方案 »

  1.   

    你好像没有正确获得另一个进程窗口上的CListCtrl指针吧!
      

  2.   

    确实的已经获得了,因为GetItemCount()返回的数值的确是对的,而且如果在循环里添加一句 list->SetItemText(i,0,"aaa")则把该列表的第一列全部变成空了,而不是“aaa”,的确很奇怪
      

  3.   

    应该是list->InsertItem(i,0,"aaa");
      

  4.   

    CListCtrl *list;
    .....//此处获得另一个进程窗口上的一个CListCtrl指针
    for(int i=0;i<list->GetItemCount();i++)  //GetItemCount()返回31
      AfxMessageBox(list->GetItemText(i,0));
    //此处本以为可以获得该ListCtrl的各个item的caption,可是结果并非如此,这样你是得不到item的Caption的!
    你可以用m_List->GetHeadCtrl()后在处理!
      

  5.   

    你的系统是win9x还是winnt/win2k呢?win9x的各个进程的内存空间地址(虽然是虚拟地址)是统一的..winnt/win2k则是在各自的虚拟内存地址上面,完全不能互相访问知道上面的问题以后,也许你很奇怪,为什么win2k下的GetWindowText也可以获得另外一个窗体的caption?这是因为SendMessage(...,WM_GETTEXT,,,)消息发送到另外一个窗体的时候,它会自己调用WM_COPYDATA消息把数据填充,然后返回到发送消息的进程内存空间,于是就可以访问到了..
    如果一定想访问另外一个进程的某些数据,需要使用注入线程的方式...
    哎,说了一大通..其实自己也不太清楚..上面的大概就是Jeffery Richter 的大作里面提到的吧..我把我记得的和理解的就写出来了,也许有误,大概也就是那个意思
      

  6.   

    gameboy999(我心迷茫)
    依我的理解,你说的是访问另外一个进程的内存空间,这是基于指针的,也就是象访问自己的数据一样访问另一进程的数据,由于windows存储保护机制的限制确实的是无法直接访问的。
    但是我获得该listctrl指针的方法其实只是获得该控件的句柄,而句柄是全局的,知道了句柄,要访问该窗口(控件)的数据就可以利用windows的消息机制了,也就是你前面说的那个过程。我前面说过GetItemCount()可以获得正确的Item数量也就说明了该句柄的正确性,所以我觉得GetItemText()也理所当然的应该能获得指定Item的Text了。不知gameboy999兄有何指点
      

  7.   

    是有点奇怪,关注,把程序给我一份,我看看。[email protected]
      

  8.   

    程序的关键部分都已经在上面了,因为获得的listctrl所在的程序是与硬件相关的,没有板卡给你你也没办法调试,所以就发给你也没用了
      

  9.   

    精简了一下程序,这样子了,谁看看到底怎么回事 CWnd* wndFind=FindWindow(0,"list");
    if (!wndFind) return;
    CWnd* wndSetting=wndFind;
    if(wndSetting)
    for(wndSetting=wndSetting->GetWindow(GW_CHILD);wndSetting;wndSetting=wndSetting->GetNextWindow()){
    CString str;
    wndSetting->GetWindowText(str);
    if (str=="List1") break;
    }
    CListCtrl* list=(CListCtrl*)wndSetting;
    for (int i=0;i<list->GetItemCount();i++)
    AfxMessageBox(list->GetItemText(i,0));
      

  10.   

    问题的确是跟gameboy999(我心迷茫)  所说的差不多,虽然没直接帮我解决问题,还是非常感谢。
      

  11.   

    看Jeffrey Richter的《Windows核心编程》中关于DLL部分,里面有获取ListView控件内容的源码。