记录一些学习小事

Work hard

统计

留言簿

阅读排行榜

评论排行榜

快照、用进程快照,和模块快照做个简单的任务管理器

得到系统中的进程信息
CreateToolhelp32Snapshot 快照  
此函数能得到系统中的所有进程 所有模块 信息等
然后用Process32First得到快照第一个节点信息(快照得到的东西相当于链表)
用此可以实现一个windows任务管理器。
用mFc写的。
//把ListCtrl的表头做出来
CListCtrl * m_pListCtrl=new CListCtrl;//m_pListCtrl要类的全局变量哦 
m_pListCtrl->Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT
,CRect(50,50,590,350),this,IDC_LIST1);
m_pListCtrl->SetExtendedStyle(m_pListCtrl->GetExtendedStyle()|
LVS_EX_HEADERDRAGDROP|LVS_EX_FULLROWSELECT|
LVS_EX_TWOCLICKACTIVATE|LVS_EX_UNDERLINECOLD);
m_pListCtrl->InsertColumn(0,_T("进程名"),LVCFMT_LEFT,120);
m_pListCtrl->InsertColumn(1,_T("进程ID"),LVCFMT_LEFT,70);
m_pListCtrl->InsertColumn(2,_T("线程数量"),LVCFMT_LEFT,70);
m_pListCtrl->InsertColumn(3,_T("路径"),LVCFMT_LEFT,340);

//读取所有运行中的进程 和进程名字 加入到 ListCtrl中
   m_pListCtrl->DeleteAllItems();//先清空里面的所有item 一开始是没有的,但是也要写一下。
HANDLE hSnapProcess=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//创建进程快照
HANDLE hSnapModule;
PROCESSENTRY32 pe;
MODULEENTRY32  me;
ZeroMemory(&me,sizeof(MODULEENTRY32));
ZeroMemory(&pe,sizeof(PROCESSENTRY32));
me.dwSize=sizeof(MODULEENTRY32);
pe.dwSize=sizeof(PROCESSENTRY32);
int pos=0;
Process32First(hSnapProcess,&pe);//从线程快照中读取第一个进程信息
CString strTemp;
do 
{
hSnapModule=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pe.th32ProcessID);   //根据进程id创建模块快照
m_pListCtrl->InsertItem(pos,_T(""));     //插入一个item
Module32First(hSnapModule,&me);        //读取模块中的信息  只有一个模块。因为是根据具体进程创建的模块快照
m_pListCtrl->SetItemText(pos,0,pe.szExeFile);   //设置的进程名
strTemp.Format(_T("%d"),pe.th32ProcessID);
m_pListCtrl->SetItemText(pos,1,strTemp);   //进程id
strTemp.Format(_T("%d"),pe.cntThreads);
m_pListCtrl->SetItemText(pos,2,strTemp);    //线程数
m_pListCtrl->SetItemText(pos,3,me.szExePath);   //进程exe路径
} while (Process32Next(hSnapProcess,&pe));//读下一个进程

在写个关闭进程 的按钮
void CProcessManagerDlg::OnBnClickedButtonClose()
{
    
int iMark=m_pListCtrl->GetSelectionMark();
    
if(-1!=iMark)
    {
        CString  str
=m_pListCtrl->GetItemText(iMark,1);
        HANDLE hProcess
=OpenProcess(PROCESS_ALL_ACCESS,FALSE,_wtoi(str));
        DWORD dExitCode;
        GetExitCodeProcess(hProcess,
&dExitCode);
        TerminateProcess(hProcess,dExitCode);
        m_pListCtrl
->DeleteItem(iMark);
        str.Format(_T(
"%d"),--count);
        GetDlgItem(IDC_STATIC_COUNT)
->SetWindowText(str);
    }
    
else
    {
        MessageBox(_T(
"没有选中进程"));
    }

}

  嘿嘿,看看这个图 还是挺好的。

   



posted on 2011-07-31 14:34 陈晓 阅读(2196) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理