书中例子来源于中国水利水电出版社《VC++课程设计案例精编》
按钮IDOK,IDC_STOP,IDCANCEL
基于对话框,首先是PorcessManagerDlg.h需要头文件
#include "TLHELP32.H"
添加元素
public:
DWORD m_ProcessIndex[50];//存放所有进程ID
对四个按钮添加关联控件变量
m_exit; m_show; m_stop; m_showlist;
然后InitDialog函数中初始化
m_showlist.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);//list栏格式 m_showlist.InsertColumn(0,"进程映像名称"); m_showlist.InsertColumn(1,"进程开放的线程数"); m_showlist.InsertColumn(2,"PID"); m_showlist.InsertColumn(3,"优先级"); for (int i = 0 ; i < 4; i++ ) { m_showlist.SetColumnWidth(i,150);//设置列宽 }
然后两个按钮的响应函数
void CProcessManagerDlg::OnGetProcess() { // TODO: Add your control notification handler code here HANDLE Snapshot; //获得某一时刻系统进程 堆 模块或线程快照信息 Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //定义进程的信息字符串 PROCESSENTRY32 processListStr; processListStr.dwSize = sizeof(PROCESSENTRY32); BOOL return_value; //获得系统进程链表中第一个进程的信息 return_value = Process32First(Snapshot, &processListStr); //放进进程的字符串数组 m_showlist.DeleteAllItems(); int i = 0 ; while (return_value) { m_showlist.InsertItem(i,processListStr.szExeFile,0); CString s; s.Format("%d",processListStr.cntThreads); m_showlist.SetItemText(i,1,s); s.Format("%d",processListStr.th32ParentProcessID); m_showlist.SetItemText(i,2,s); s.Format("%d",processListStr.pcPriClassBase); m_showlist.SetItemText(i,3,s); int memory = processListStr.cntThreads; //把代表进程的ID号存入数组中,便于中止 m_ProcessIndex[i] = processListStr.th32ParentProcessID; //使得系统进程链表中下一个进程的信息 return_value = Process32Next(Snapshot, &processListStr); i++; } }
另外个
void CProcessManagerDlg::OnStopProcess() { // TODO: Add your control notification handler code here //定位待中止的进程 POSITION pos = m_showlist.GetFirstSelectedItemPosition(); int currentSelect = m_showlist.GetNextSelectedItem(pos); if (currentSelect > 0) { //选择某项 CString FileBuffer; //获得进程的可执行文件的文件名 FileBuffer = CString(TEXT("确实要中止吗?")+ m_showlist.GetItemText(currentSelect,0) + TEXT("? 三思啊!!")); if (AfxMessageBox(FileBuffer,MB_OKCANCEL,0) == IDOK) {//先获得进程句柄,通过进程标识 HANDLE ProcessHandle; ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, m_ProcessIndex[currentSelect]) ; //利用数组ID指定的 获得存在的一个进程的句柄 if (ProcessHandle) {//中止 if( TerminateProcess(ProcessHandle,1) ) //终止成功,返回非0 AfxMessageBox("指定进程真的终结了啊! "); //刷新显示 OnGetProcess(); } else AfxMessageBox("系统不允许终结的哦"); } } else { AfxMessageBox("哥哥,你好歹选择一个进程先啊"); } }