分类: C/C++
2008-08-01 17:07:43
题目是一位网友在我留言板上的留言,不知道大家看没看过我曾经写过的《如何向其他程序的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三:以上代码在Win2000P SP4 VC6 SP6测试通过。#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; }
《如何向其他程序的ListView控件发送LVM_GETITEMTEXT消息》:
可通过搜索引擎获得。