一:程序說明
這次我將介紹如何更改其他程序ListView控件中某個Item的內容,關於類似的拙文我已經寫了兩篇,這是第三篇,本篇和第一篇《如何向其他程序的 ListView 控件發送 LVM_GETITEMTEXT 消息》類似,區別在於:
作為演示,下面的這段程序將更改TaskManager中第6個項目中第1列的內容。程序運行後的效果圖:
二:具體實踐
//////////////////////////////////////////////////////////////////////////////////
/*
* Send LVM_SETITEMTEXT
* 版權所有 (C) 2005 天津 趙春生
* 2005.10.28
* http://timw.yeah.net
* http://timw.126.com
* 本程序適用於: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測試通過。