Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2095845
  • 博文数量: 909
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 12260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-06 20:50
文章分类

全部博文(909)

文章存档

2008年(909)

我的朋友

分类:

2008-05-06 22:33:36

一起学习
如何更改其它程序 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消息
  • 如何选中其它程序ListView控件中的某个Item
  • 下载本文示例代码


    如何更改其它程序 ListView 控件中某个 Item 的内容如何更改其它程序 ListView 控件中某个 Item 的内容如何更改其它程序 ListView 控件中某个 Item 的内容如何更改其它程序 ListView 控件中某个 Item 的内容如何更改其它程序 ListView 控件中某个 Item 的内容如何更改其它程序 ListView 控件中某个 Item 的内容如何更改其它程序 ListView 控件中某个 Item 的内容如何更改其它程序 ListView 控件中某个 Item 的内容如何更改其它程序 ListView 控件中某个 Item 的内容如何更改其它程序 ListView 控件中某个 Item 的内容如何更改其它程序 ListView 控件中某个 Item 的内容如何更改其它程序 ListView 控件中某个 Item 的内容
    阅读(239) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~