首页
社区
课程
招聘
给其它程序列表框插入数据......
发表于: 2011-7-28 14:07 4450

给其它程序列表框插入数据......

2011-7-28 14:07
4450
用如下代表给其它程序的列表框增加了两行数据, 已经可以了,但是一个新的问题是, 这个列表框上的数据不会消息了,每次都是从累加的增加. 为什么 ?

         if ( !::IsWindow(listview) )
          return;

         TRACE("AddItemToList");

         DWORD   dwStyle  =  ::SendMessage(listview,   LVM_GETEXTENDEDLISTVIEWSTYLE,   0,   0);

         LVITEM lvi, *_lvi;
         lvi.cchTextMax=512;
         char *_item;
         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 和 _item 的远程地址
         _lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM),
          MEM_COMMIT, PAGE_READWRITE);
         _item=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,
          PAGE_READWRITE);

         //插入一项提示现在处于搜索模式
         lvi.mask = LVIF_TEXT;  //标志位 文本
         lvi.iItem = 0 ;   //可修改为想要插入的行
         lvi.iSubItem = 0;      //此项是第几列的数据   
         lvi.pszText =_item;   //文本

         WriteProcessMemory(process, _item, _T("test item"), 512, NULL);
         WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);

         ::SendMessage(listview, LVM_INSERTITEM, 0,(LPARAM)_lvi);  
         
         lvi.mask = LVIF_TEXT;
         lvi.iItem = 0 ;   //可修改为想要插入的行
     lvi.iSubItem = 1;
     lvi.pszText = _item;
   
         WriteProcessMemory(process, _item, _T("bbbbb"), 512, NULL);
         WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
     ::SendMessage(listview,LVM_SETITEM,0,(LPARAM)_lvi);

     ::SendMessage(listview,   LVM_SETEXTENDEDLISTVIEWSTYLE,   0,   dwStyle);
         VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
         VirtualFreeEx(process, _item, 0, MEM_RELEASE);
         CloseHandle (process);

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2


如上图所示,我重新打开这个页面后,这两项仍然存在, 我再用上面的代表新增后,在下面累加.
上传的附件:
2011-7-28 14:09
0
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
只要不关闭这个应用程序, 关闭这个窗口后,重新打开.这两项数据仍在.
2011-7-28 14:10
0
雪    币: 575
活跃值: (186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
每次插入数据之前LVM_DELETEALLITEMS删除掉原来的所有项
::SendMessage(listview,LVM_DELETEALLITEMS,0,0);
2011-7-28 14:11
0
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
1.首先想知道为什么会出现这种情况.
2. 另外就是我这个程序是给其它的程序插入数据, 关闭这个页面和打开这个页面,是在其它程序里操作的,比如它打开这个页面,我的程序有个自动导入的,导完后它要新建下一条,这时我导的这个列表里的数据仍在,其它的edit都是空的,所以体验度不高.
2011-7-28 14:16
0
雪    币: 575
活跃值: (186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
1.目标列表框对象应该没有被销毁,所以你上次插入的数据会一直还在,除非你显式的删除数据
2.不太明白你说的情况
2011-7-28 16:35
0
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
意思就是:目标程序有一个 新增表单 按钮,一点这个按钮后就会出现这个表单的页面,我的程序有一个自动导入的按钮,一点这个按钮就会把数据填在目档程序上,目标程序在填完后点保存,然后再点新增,这时表单清空了.
这时问题就来了,因为我的程序导入的数据(列表框)里的不会被清空,一直都存在, 除非目标程序关闭后重新开启.

有什么方法很够避免这种情况?
2011-7-29 12:57
0
游客
登录 | 注册 方可回帖
返回
//