Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9727847
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: C/C++

2008-04-23 22:01:30

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

作者:天津/



一:程序说明

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

  1. 发送的消息不同:前者是读取pszText的内容——发送LVM_GETITEMTEXT;这次是设置pszText,应该发送LVM_SETITEMTEXT;
  2. 字符串缓冲区的作用不同:前者pItem用来接收ITEMTEXT,我们可以通过ReadProcessMemory函数来读取其内容;而在本篇中p_MyItemText则用来存放我们要设置的ITEMTEXT,并用WriteProcessMemory函数将其写入到目标程序中。

作为演示,下面的这段程序将更改TaskManager中第6个项目中第1列的内容。程序运行后的效果图:

二:具体实践


//////////////////////////////////////////////////////////////////////////////////

/*

 *	Send LVM_SETITEMTEXT

 *	版权所有 (C) 2005 天津 赵春生

 *	2005.10.28

 *	

 *	

 *	本程序适用于:Win2KP SP4[Windows TaskManager(5.0.2195.6620)]

 *				 WinXP SP1[Windows TaskManager]

 *	代码在Win2000P SP4   VC6 SP6测试通过

*/

//////////////////////////////////////////////////////////////////////////////////



#include

#include



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测试通过。

源码可从我的个人主页下载。



其它文章:
  • 如何向其它程序的ListView控件发送LVM_GETITEMTEXT消息
  • 阅读(519) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~