如何更改其它程序 ListView 控件中某个 Item 的内容

翻译|其它|编辑:郝浩|2007-02-26 15:56:27.000|阅读 1848 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>


下载源代码

一:程序说明

  这次我将介绍如何更改其他程序ListView控件中某个Item的内容,关于类似的拙文我已经写了两篇,这是第三篇,本篇和第一篇《如何向其他程序的 ListView 控件发送 LVM_GETITEMTEXT 消息》类似,区别在于:

发送的消息不同:前者是读取pszText的内容——发送LVM_GETITEMTEXT;这次是设置pszText,应该发送LVM_SETITEMTEXT; 字符串缓冲区的作用不同:前者pItem用来接收ITEMTEXT,我们可以通过ReadProcessMemory函数来读取其内容;而在本篇中p_MyItemText则用来存放我们要设置的ITEMTEXT,并用WriteProcessMemory函数将其写入到目标程序中。 作为演示,下面的这段程序将更改TaskManager中第6个项目中第1列的内容。程序运行后的效果图:


二:具体实践


////////////////////////////////////////////////////////
/*
* 本程序适用于:Win2KP+SP4[Windows TaskManager(5.0.2195.6620)]
* WinXP+SP1[Windows TaskManager]
* 代码在Win2000P+SP4 + VC6+SP6测试通过
*/
////////////////////////////////////////////////////////

#include<windows.h>
#include<commctrl.h>

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)

{
     HWND hwnd;
     int iItem=0;
     LVITEM lvitem, *plvitem;
     DWORD PID;
     HANDLE hProcess;
     char *p_MyItemText;//目标程序中用来存放TEXT的地址

     //The pszText member is the pointer to a null-terminated
     // string containing the new text; it can also be NULL.
     //以上信息是从API手册中获得的,故在本例中字符串长度不能>=12,
     //以确保字符串后有NULL。
     char str_MyItemText[12]={0};
     strcpy(str_MyItemText,"天津 赵春生");


     hwnd=FindWindow("#32770","Windows 任务管理器");
     hwnd=FindWindowEx(hwnd,0,"#32770",0);
     hwnd=FindWindowEx(hwnd,0,"SysListView32",0);

     if (!hwnd)
          MessageBox(NULL,"[Windows 任务管理器] 尚未启动!","错误!",NULL);
     else
     {
          GetWindowThreadProcessId(hwnd, &PID);

          hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
          if (!hProcess)
               MessageBox(NULL,"获取进程句柄操作失败!","错误!",NULL);
          else
          {
               plvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);
               p_MyItemText=(char*)VirtualAllocEx(hProcess, NULL, 12, MEM_COMMIT, PAGE_READWRITE);

               if ((!plvitem)||(!p_MyItemText))
                    MessageBox(NULL,"无法分配内存!","错误!",NULL);
               else
               {
                    MessageBox(NULL,"本演示程序将更改TaskManager中第6个项目中第1列的内容。","提示",NULL);

                    iItem=5;//5在这里是第六个(从零开始)
                    lvitem.iSubItem=0;//同上
                    lvitem.pszText=p_MyItemText;

                    WriteProcessMemory(hProcess, p_MyItemText, &str_MyItemText, 12, NULL);
                    WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);
                    //向目标程序发送LVM_SETITEMTEXT消息
                    SendMessage(hwnd, LVM_SETITEMTEXT, (WPARAM)iItem, (LPARAM)plvitem);
               }
          }
     }

     //释放内存
     CloseHandle(hwnd);
     CloseHandle(hProcess);
     VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);
     VirtualFreeEx(hProcess, p_MyItemText, 0, MEM_RELEASE);

     return 0;
}

三、以上代码在Win2000P+SP4 + VC6+SP6测试通过。

 


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP