当前例程实现修改任务管理器中的显示内容。
运行程序,点击按钮就好。
前提前管理器要手动提前打开。
效果如下图
上位机MFC更改任务管理器列表控件内容
项目源代码下载
关键代码
- void CGkbc8Dlg::OnButton1()
- {
- 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("[Windows 任务管理器] 尚未启动!","错误!");
-
- else
- {
- GetWindowThreadProcessId(hwnd, &PID);
-
- hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
- if (!hProcess)
-
- MessageBox("获取进程句柄操作失败!","错误!");
-
- 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("无法分配内存!","错误!");
-
- else
- {
- MessageBox("本演示程序将更改TaskManager中第6个项目中第1列的内容。","提示");
-
- 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);
- }
复制代码
|