关于CListCtrl的怪事 你如何获得另一个进程窗口上的CListCtrl指针,确认已经正确获得了吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你好像没有正确获得另一个进程窗口上的CListCtrl指针吧! 确实的已经获得了,因为GetItemCount()返回的数值的确是对的,而且如果在循环里添加一句 list->SetItemText(i,0,"aaa")则把该列表的第一列全部变成空了,而不是“aaa”,的确很奇怪 应该是list->InsertItem(i,0,"aaa"); 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()后在处理! 你的系统是win9x还是winnt/win2k呢?win9x的各个进程的内存空间地址(虽然是虚拟地址)是统一的..winnt/win2k则是在各自的虚拟内存地址上面,完全不能互相访问知道上面的问题以后,也许你很奇怪,为什么win2k下的GetWindowText也可以获得另外一个窗体的caption?这是因为SendMessage(...,WM_GETTEXT,,,)消息发送到另外一个窗体的时候,它会自己调用WM_COPYDATA消息把数据填充,然后返回到发送消息的进程内存空间,于是就可以访问到了..如果一定想访问另外一个进程的某些数据,需要使用注入线程的方式...哎,说了一大通..其实自己也不太清楚..上面的大概就是Jeffery Richter 的大作里面提到的吧..我把我记得的和理解的就写出来了,也许有误,大概也就是那个意思 gameboy999(我心迷茫)依我的理解,你说的是访问另外一个进程的内存空间,这是基于指针的,也就是象访问自己的数据一样访问另一进程的数据,由于windows存储保护机制的限制确实的是无法直接访问的。但是我获得该listctrl指针的方法其实只是获得该控件的句柄,而句柄是全局的,知道了句柄,要访问该窗口(控件)的数据就可以利用windows的消息机制了,也就是你前面说的那个过程。我前面说过GetItemCount()可以获得正确的Item数量也就说明了该句柄的正确性,所以我觉得GetItemText()也理所当然的应该能获得指定Item的Text了。不知gameboy999兄有何指点 是有点奇怪,关注,把程序给我一份,我看看。[email protected] 程序的关键部分都已经在上面了,因为获得的listctrl所在的程序是与硬件相关的,没有板卡给你你也没办法调试,所以就发给你也没用了 精简了一下程序,这样子了,谁看看到底怎么回事 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)); 问题的确是跟gameboy999(我心迷茫) 所说的差不多,虽然没直接帮我解决问题,还是非常感谢。 看Jeffrey Richter的《Windows核心编程》中关于DLL部分,里面有获取ListView控件内容的源码。 关于窗口最小化与最大化按钮的实现 文件分块广播传输 谁能给下OpenGL的glut库中的函数? VC中如何分成2*1的框? VC++怎樣與串口通信?是否可提供源代碼 Ado中用_RecordsetPtr的->Execute方法插入记录时出错 h.263的算法 MFC静态链接库中的资源问题。(高分求助) 用c++将文本文件存入数组问题 各位大哥,可不可以告诉我如何用HTTP下栽文件?谢谢! 问个有趣的高难度问题~~~可以把小于分辨率大小的图片不放在桌面中央吗(不伸缩)?关注也有分,呵呵 对话框的tab键为何不起作用
.....//此处获得另一个进程窗口上的一个CListCtrl指针
for(int i=0;i<list->GetItemCount();i++) //GetItemCount()返回31
AfxMessageBox(list->GetItemText(i,0));
//此处本以为可以获得该ListCtrl的各个item的caption,可是结果并非如此,这样你是得不到item的Caption的!
你可以用m_List->GetHeadCtrl()后在处理!
如果一定想访问另外一个进程的某些数据,需要使用注入线程的方式...
哎,说了一大通..其实自己也不太清楚..上面的大概就是Jeffery Richter 的大作里面提到的吧..我把我记得的和理解的就写出来了,也许有误,大概也就是那个意思
依我的理解,你说的是访问另外一个进程的内存空间,这是基于指针的,也就是象访问自己的数据一样访问另一进程的数据,由于windows存储保护机制的限制确实的是无法直接访问的。
但是我获得该listctrl指针的方法其实只是获得该控件的句柄,而句柄是全局的,知道了句柄,要访问该窗口(控件)的数据就可以利用windows的消息机制了,也就是你前面说的那个过程。我前面说过GetItemCount()可以获得正确的Item数量也就说明了该句柄的正确性,所以我觉得GetItemText()也理所当然的应该能获得指定Item的Text了。不知gameboy999兄有何指点
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));