// myProcess.cpp : implementation file // #include "stdafx.h" #include "myTaskmgr.h" #include "myProcess.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #include "tlhelp32.h" #include "Psapi.h" #pragma comment(lib, "Psapi.lib") ///////////////////////////////////////////////////////////////////////////// // myProcess dialog myProcess::myProcess(CWnd* pParent /*=NULL*/) : CDialog(myProcess::IDD, pParent) { //{{AFX_DATA_INIT(myProcess) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } void myProcess::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(myProcess) DDX_Control(pDX, IDC_LIST1, m_list); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(myProcess, CDialog) //{{AFX_MSG_MAP(myProcess) ON_WM_TIMER() ON_BN_CLICKED(IDC_CLOSE, OnClose) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // myProcess message handlers BOOL myProcess::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_INFOTIP | LVS_EX_FULLROWSELECT); m_list.InsertColumn(0,_T("映像名称"),LVCFMT_LEFT,80,0); m_list.InsertColumn(1,_T("进程ID"),LVCFMT_LEFT,80,1); m_list.InsertColumn(2,_T("父进程ID"),LVCFMT_LEFT,80,2); m_list.InsertColumn(3,_T("内存使用"),LVCFMT_LEFT,80,3 ); SetTimer(0, 1000, NULL); getState(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void myProcess::getState() { m_list.DeleteAllItems(); m_num = 0; int i=0; CString strReFlx,strID,strFID,strMem; PROCESSENTRY32 process; process.dwSize = sizeof(process); HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); BOOL bMore = Process32First(hProcess,&process); PROCESS_MEMORY_COUNTERS pmc; int CurMem = 0; int MaxMem = 0; HANDLE hProcess1; while (bMore) { bMore = Process32Next(hProcess,&process); strReFlx.Format("%s",process.szExeFile); strID.Format("%5u",process.th32ProcessID); strFID.Format("%u",process.th32ParentProcessID); m_list.InsertItem(i,strReFlx); m_list.SetItemText(i,1,strID); m_list.SetItemText(i,2,strFID); m_id[m_num++] = process.th32ProcessID; CurMem = 0; MaxMem = 0; hProcess1 = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, process.th32ProcessID); if (GetProcessMemoryInfo(hProcess1, &pmc, sizeof(pmc))) { CurMem = pmc.WorkingSetSize / 1024; MaxMem = pmc.PeakWorkingSetSize / 1024; } strMem.Format("%dK",CurMem); m_list.SetItemText(i,3,strMem); i++; CloseHandle(hProcess1); } CloseHandle(hProcess); } void myProcess::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default int nIndex; nIndex=m_list.GetSelectionMark(); int i=0; CString strReFlx,strID,strFID,strMem; PROCESSENTRY32 process; process.dwSize = sizeof(process); HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); BOOL bMore = Process32First(hProcess,&process); PROCESS_MEMORY_COUNTERS pmc; int CurMem = 0; int MaxMem = 0; while (bMore) { bMore = Process32Next(hProcess,&process); HANDLE hProcess; PROCESS_MEMORY_COUNTERS pmc; CurMem = 0; MaxMem = 0; hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, process.th32ProcessID); if (GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc))) { CurMem = pmc.WorkingSetSize / 1024; MaxMem = pmc.PeakWorkingSetSize / 1024; } if(CurMem > 1000) strMem.Format("%d,%dK",CurMem/1000,CurMem%1000); else strMem.Format("%dK",CurMem); m_list.SetItemText(i,3,strMem); i++; } CloseHandle(hProcess); if(i != m_num) getState(); m_list.SetSelectionMark( nIndex ); m_list.SetItemState(nIndex ,LVIS_SELECTED,LVIS_SELECTED); CDialog::OnTimer(nIDEvent); } void myProcess::OnClose() { CString str; str = m_list.GetItemText(m_list.GetSelectionMark(),0) ; HANDLE hProcess=OpenProcess(PROCESS_TERMINATE,FALSE,m_id[m_list.GetSelectionMark()]); if(MessageBox("确定要关闭\n "+str,"信息询问",MB_YESNO) == IDNO) { return; } if(hProcess==NULL) { return ; } if(TerminateProcess(hProcess,-1)==0) { return ; } if(CloseHandle(hProcess)==0) { return ; } }