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

全部博文(909)

文章存档

2008年(909)

我的朋友

分类:

2008-05-06 22:31:22

一起学习
如何选中其他程序ListView控件中的某个Item

作者:天津 赵春生

下载源代码

一:程序说明:

题目是一位网友在我留言板上的留言,不知道大家看没看过我曾经写过的《如何向其他程序的ListView控件发送LVM_GETITEMTEXT消息》一文?在那篇拙文中,我的目的是得到某一Item的TEXT。于是我将LVITEM结构插入到了目标进程中,才使得目标进程正确响应LVM_GETITEMTEXT消息。

要得到某一Item的TEXT,需要发送LVM_GETITEMTEXT消息,而要选中某个Item则要发送LVM_SETITEMSTATE消息:

LVM_GETITEMTEXT

wParam = (WPARAM) (int) iItem;

lParam = (LPARAM) (LV_ITEM FAR *) pitem;



LVM_SETITEMSTATE

wParam = (WPARAM) (int) i;

lParam = (LPARAM) (LV_ITEM FAR *) pitem;

看到了吗?两个消息的参数一模一样!再来看看LV_ITEM结构的设置:只需将state和stateMask设置成LVIS_SELECTED,并指定iItem即可。直接修改上篇拙文中的代码就能轻松搞定本篇要解决的问题。

作为演示,下面的这段程序将选中TaskManager中第6个项目。

二:具体实践:

/*

 *	Send LVM_SETITEMSTATE

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

 *	2005.08.04

 *	

 *	

 *	本程序适用于: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;

	

	

	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);



				if (!plvitem)

					

					MessageBox(NULL,"无法分配内存!","错误!",NULL);

				

				else

				{

					MessageBox(NULL,"本演示程序将选中TaskManager中的第6个项目。","提示",NULL);

					

					iItem=5;//5在这里是第六个(从零开始)



					lvitem.state=LVIS_SELECTED;

					lvitem.stateMask=LVIS_SELECTED;

					WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);

					SendMessage(hwnd, LVM_SETITEMSTATE, (WPARAM)iItem, (LPARAM)plvitem);

					

				}

			}

		}

	

	//释放内存

	CloseHandle(hwnd);

	CloseHandle(hProcess);

	VirtualFreeEx(hProcess, plvitem, 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
阅读(352) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~