LVM_GETITEMTEXT 获取ListView的内容

oldm4n 2012-02-23 03:59:18
写程序想对Foxmail的远程邮箱管理做些定制改动,以符合自己的使用习惯。
在Foxmail的远程邮箱管理界面,显示邮件列表的是TListView控件,我现在的做法是写了一个dll,将该dll插入了foxmail的进程,在该dll中subclass了这个TListView控件的实例,然后尝试了以下方法想要获取ListView中所有行的第二列的文本:

LVM_GETITEMTEXT / ListView_GetItemText
LVM_GETITEM / ListView_GetItem
WM_NOTIFY - LVN_GETDISPINFO

dll中的代码已用ListView_GetItemCount取得了列表中项的行数,现在的问题是,无论我指定第几行,取到的永远是第一行的数据(即使我遍历全部N行,结果也不过是取出了N个一样的数据),求思路,谢谢。


...全文
756 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
反弹让他 2013-07-21
  • 打赏
  • 举报
回复
引用 6 楼 oldm4n 的回复:
我是想取所有行的第一列,如下,不管我怎么指定行,返回的总是第一行第一列

ListView_GetItemText(hwndTarget, 0, 1, buf, sizeof(buf));
ListView_GetItemText(hwndTarget, 1, 1, buf, sizeof(buf));
ListView_GetItemText(hwndTarget, 2, 1, buf, sizeof(buf));
...
...
我还试过以下方法,结果都是第一行第一列:

int count = ListView_GetItemCount(hwndTarget);
char buf[64] = { 0 };
int i = 0;
for(i = 0; i < count; i ++)
{
    memset(buf, 0, sizeof(buf));

    /* Method-1 */
    ListView_GetItemText(hwndTarget, i, 1, buf, sizeof(buf));

    /* Method-1.1 */
    //LVITEM item = { 0 };
    //item.mask = LVIF_TEXT;
    //item.iItem = i;
    //item.iSubItem = 1;
    //item.pszText = buf;
    //item.cchTextMax = sizeof(buf);
    //LRESULT ret = SendMessage(hwndTarget, LVM_GETITEMTEXT, i,(LPARAM)&item);

    /* Method-2, always first item */
    //LVITEM item = { 0 };
    //item.mask = LVIF_TEXT;
    //item.iItem = i;
    //item.iSubItem = 1;
    //item.pszText = buf;
    //item.cchTextMax = sizeof(buf);
    //ListView_GetItem(hwndTarget, &item);

    /* Method-3 */
    //NMLVDISPINFO nmldi = { 0 };
    //nmldi.hdr.hwndFrom = hwndTarget;
    //nmldi.hdr.code = LVN_GETDISPINFO;
    //nmldi.item.mask = LVIF_TEXT;
    //nmldi.item.iItem = i;
    //nmldi.item.iSubItem = 1;
    //nmldi.item.pszText = buf;
    //nmldi.item.cchTextMax = sizeof(buf);
    
    //SendMessage(hwndTarget, WM_NOTIFY, (WPARAM)hwndTarget, (LPARAM)&nmldi);
}
@oldm4n 你的SubItem不循环当然只能取到第一个了!
反弹让他 2013-07-20
  • 打赏
  • 举报
回复
我也为这个listview问题困扰了几天,通过ReadProcessMemory总是取不到数据,我干脆采用逐行扫描了
向立天 2013-02-05
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
oldm4n 2012-02-27
  • 打赏
  • 举报
回复
... Foxmail 的作者我不认识哎。。。不然我就问他了
oldm4n 2012-02-27
  • 打赏
  • 举报
回复
顺便说一下,我自己做的对比测试的小程序里面的ListView,用上面的任意一种方法都能正确获得所有行或指定行,就是Foxmail的不行,用Spy++琢磨了N久了,从属性到消息,目前没看出来有什么不合适的,可是就是只给我第一个item的数据,我甚至也考虑过Foxmail是不是用了虚列表了,老样子
oldm4n 2012-02-27
  • 打赏
  • 举报
回复
哦,上贴中我说的“第一列”,是指第一个subitem...,口误口误,抱歉,谢谢
oldm4n 2012-02-27
  • 打赏
  • 举报
回复
我是想取所有行的第一列,如下,不管我怎么指定行,返回的总是第一行第一列

ListView_GetItemText(hwndTarget, 0, 1, buf, sizeof(buf));
ListView_GetItemText(hwndTarget, 1, 1, buf, sizeof(buf));
ListView_GetItemText(hwndTarget, 2, 1, buf, sizeof(buf));
...
...


我还试过以下方法,结果都是第一行第一列:

int count = ListView_GetItemCount(hwndTarget);
char buf[64] = { 0 };
int i = 0;
for(i = 0; i < count; i ++)
{
memset(buf, 0, sizeof(buf));

/* Method-1 */
ListView_GetItemText(hwndTarget, i, 1, buf, sizeof(buf));

/* Method-1.1 */
//LVITEM item = { 0 };
//item.mask = LVIF_TEXT;
//item.iItem = i;
//item.iSubItem = 1;
//item.pszText = buf;
//item.cchTextMax = sizeof(buf);
//LRESULT ret = SendMessage(hwndTarget, LVM_GETITEMTEXT, i,(LPARAM)&item);

/* Method-2, always first item */
//LVITEM item = { 0 };
//item.mask = LVIF_TEXT;
//item.iItem = i;
//item.iSubItem = 1;
//item.pszText = buf;
//item.cchTextMax = sizeof(buf);
//ListView_GetItem(hwndTarget, &item);

/* Method-3 */
//NMLVDISPINFO nmldi = { 0 };
//nmldi.hdr.hwndFrom = hwndTarget;
//nmldi.hdr.code = LVN_GETDISPINFO;
//nmldi.item.mask = LVIF_TEXT;
//nmldi.item.iItem = i;
//nmldi.item.iSubItem = 1;
//nmldi.item.pszText = buf;
//nmldi.item.cchTextMax = sizeof(buf);

//SendMessage(hwndTarget, WM_NOTIFY, (WPARAM)hwndTarget, (LPARAM)&nmldi);
}


Eleven 2012-02-27
  • 打赏
  • 举报
回复
你的意思是只得到ListCtrl控件的第一行的内容,其它item得不到?是不是参数指定的不对?
Liberty-Bird 2012-02-26
  • 打赏
  • 举报
回复
怎么这么费劲啊, 非要用LVITEM这类东东. 低效函数:
CListCtrl& listCtrl = CListView::GetListCtrl();
CString strTxt=listCtrl->GetItemText(行, 列);
oldm4n 2012-02-26
  • 打赏
  • 举报
回复
哎。。。
难道是Foxmail对这个ListView做了什么特别处理吗?
还得继续努力琢磨了。。。
oldm4n 2012-02-24
  • 打赏
  • 举报
回复
有了解的人能提供点儿建议吗?谢谢先

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧