MFC 进程管理器

来源:互联网 发布:win域名需要备案吗 编辑:程序博客网 时间:2024/05/21 11:22
1、创建对话框
2、添加CListCtrl对话框,将属性改为Style ->View->Report
设置变量m_list
m_list.DeleteAllItems();
    
    m_list.ModifyStyle(LVS_TYPEMASK, LVS_REPORT);    
    ListView_SetExtendedListViewStyle(m_list.m_hWnd,     
        LVS_EX_GRIDLINES |LVS_EX_FULLROWSELECT  );    
    //在列表控件中添加图标    
    //m_imageList.Create(IDB_BITMAP1,16,1,RGB(255,0,255));    
    //m_ListCtrl.SetImageList(&m_imageList,LVSIL_SMALL);    
    //初始化列表控件    
    m_list.InsertColumn(0,"进程ID",LVCFMT_LEFT,120,0);
    m_list.InsertColumn(1,"进程名",LVCFMT_LEFT,120,1);
    m_list.InsertColumn(2,"父进程ID",LVCFMT_LEFT,120,2);
    m_list.InsertColumn(3,"父进程名",LVCFMT_LEFT,120,3);
    
    SetTimer(20110902,1000,0);
3、为窗体添加WM_Timer事件    
添加进程获取代码如下,如果要获取父进程使用MAP查询即可
if(nIDEvent == 20110902)
    {
        //MessageBox("Timeok");
        KillTimer(20110902);
        m_list.DeleteAllItems();
        CString str;
        HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);    
        
        PROCESSENTRY32 ProcessInfo;//声明进程信息变量    
        ProcessInfo.dwSize=sizeof(ProcessInfo);//设置ProcessInfo的大小    
        //返回系统中第一个进程的信息    
        BOOL Status=Process32First(SnapShot,&ProcessInfo);    
        int m_nProcess=0;    
        while(Status)    
        {    
            m_nProcess++;    
            
            str.Format("%d",ProcessInfo.th32ProcessID);
            int irow = m_list.InsertItem(0,0);
            m_list.SetItemText(irow,0,str);
            m_list.SetItemText(irow,1,ProcessInfo.szExeFile);
            str.Format("%d",ProcessInfo.th32ParentProcessID);    
            m_list.SetItemText(irow,2,str);
            /*
            dlg.dwSize=ProcessInfo.dwSize;    
            dlg.cntUsage=ProcessInfo.cntUsage;    
            dlg.processID=ProcessInfo.th32ProcessID;    
            dlg.defaultHeapID=ProcessInfo.th32DefaultHeapID;    
            dlg.moduleID=ProcessInfo.th32ModuleID;    
            dlg.cntThreads=ProcessInfo.cntThreads;    
            dlg.parentProcessID=ProcessInfo.th32ParentProcessID;    
            dlg.classBase=ProcessInfo.pcPriClassBase;    
            dlg.dwFlags=ProcessInfo.dwFlags;    
            dlg.m_strExeFile=ProcessInfo.szExeFile;    
            TRACE("--------------%s/n",dlg.m_strExeFile);    
            break;    
            }    
            */
            //获取下一个进程的信息    
            Status=Process32Next(SnapShot,&ProcessInfo);    
        }    
        CloseHandle(SnapShot);  
4、为CListCtrl添加右键事件增加弹出菜单
    CMenu menu ,* pSubMenu; //定义下面要用到的cmenu对象
    menu.LoadMenu(IDR_POPMENU); //装载自定义的右键菜单
    
    //获取第一个弹出菜单,所以第一个菜单必须有子菜单
    pSubMenu = menu.GetSubMenu(0);
    CPoint oPoint; //定义一个用于确定光标位置的位置
    GetCursorPos( &oPoint); //获取当前光标的位置,以便使得菜单可以跟随光标
    
    //在指定位置显示弹出菜单
    pSubMenu->TrackPopupMenu (TPM_LEFTALIGN, oPoint.x, oPoint.y, this);
5、为菜单添加菜单Command事件代码如下
CListCtrl *CList =(CListCtrl *) GetDlgItem(IDC_LIST1);
    int istat=CList->GetSelectionMark();//用istat存放当前选定的是第几项
    //获取当前项中的数据,0代表是第0列
    
    CString pString =CList->GetItemText(istat,0);
    //pString.Format(_T("%d"),processindex);
    
    //    TerminateThread(
    HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE,atoi(pString) );
    if( hProcess != NULL )
    {
        TerminateThread(hProcess,0);
        CloseHandle(hProcess);
        m_list.DeleteItem(istat);
    }