//刷新
void CTaskerDlg::Refresh()
{
DWORD NewProcessID[200];
int NewProcessTotal;
//獲得所有ID
DWORD cbNeeded;
if ( !EnumProcesses( NewProcessID, sizeof(NewProcessID), &cbNeeded ) ) //receive all the Process ID Saved in aProcesses
{::MessageBox(NULL,TEXT(""),TEXT("Can not EnumProsses"),0);return;}
NewProcessTotal = cbNeeded / sizeof(DWORD); //the total of Process ID
//假如沒有ID總數(shù)沒有變化,則無(wú)需更新列表
if (NewProcessTotal==OldProcessTotal)
return;
//全部清除
m_list.DeleteAllItems();
m_imagelist.DeleteImageList( );
//設(shè)置圖標(biāo)
m_imagelist.Create(16,16,ILC_COLORDDB,2,2); //創(chuàng)建CImageList 16,16是圖標(biāo)的大小
m_list.SetImageList(&m_imagelist,LVSIL_SMALL);//把CListCtrl中的CImageList聯(lián)
int nItem=0;
HANDLE hProcess = NULL; //進(jìn)程句柄
TCHAR szProcessName[MAX_PATH] ={0}; //進(jìn)程的名稱
TCHAR szProcessPath[MAX_PATH] ={0}; //進(jìn)程路徑
HMODULE hMod=NULL; //進(jìn)程的第一個(gè)模塊
DWORD ModulecbNeeded; //儲(chǔ)存進(jìn)程模塊的大小
SHFILEINFO stFileInfo;
char buf[10];
for (int i = 0; i < NewProcessTotal; i++ )
{
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE, NewProcessID[i]);//get the handle of every Process which is Indentified by Process ID
if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &ModulecbNeeded) ) // 列舉某個(gè)進(jìn)程的模塊,第一個(gè)模塊就是創(chuàng)建此進(jìn)程的主exe程序
{
if ( GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) ) //獲得程序名
&& GetModuleFileNameEx( hProcess, hMod, szProcessPath, sizeof(szProcessPath)) )//獲得模塊路徑
{
//獲取圖標(biāo)
:: SHGetFileInfo(szProcessPath,0, &stFileInfo,sizeof(stFileInfo),SHGFI_ICON|SHGFI_SMALLICON ); //添加圖標(biāo)到m_imagelist (CImageList m_imagelist)
//向m_imagelist添加圖標(biāo)
int n=m_imagelist.Add(stFileInfo.hIcon);
//把程序名,路徑,進(jìn)程ID添加到ClistCtrl
m_list.InsertItem(nItem, szProcessName,n);//插入1行"11"代表第0列的數(shù)據(jù) 參數(shù)(行數(shù),標(biāo)題,圖標(biāo)索引)
m_list.SetItemText(nItem, 2, szProcessPath);
//更新Processdata[nItem].ID
Processdata[nItem].ID=NewProcessID[i];
//更新進(jìn)程CPU使用率
m_list.SetItemText(nItem, 1, itoa( GetProcessUsage(&Processdata[nItem]) ,buf,10) );
//改變nItem
nItem++;
}
}
CloseHandle(hProcess);
}
//更新OldProcessID
OldProcessTotal=NewProcessTotal;
}
//刪除進(jìn)程
void CTaskerDlg::OnDeleteProcess()
{
//獲得選中的行
int nItem;
POSITION pos = m_list.GetFirstSelectedItemPosition();
if (pos != NULL)
while (pos)
nItem=m_list.GetNextSelectedItem(pos);
//關(guān)閉進(jìn)程
HANDLE hProcess = OpenProcess( PROCESS_TERMINATE, FALSE, Processdata[nItem].ID );
if( NULL != hProcess )
{
if(IDOK==MessageBox("確定要?jiǎng)h除此進(jìn)程嗎?","提示",MB_OKCANCEL) )
{
if( TerminateProcess( hProcess, 0 ) )
{
CloseHandle( hProcess );
//刪除CListCtrl上的項(xiàng)
m_list.DeleteItem(nItem);
}
else
MessageBox("不能結(jié)束進(jìn)程!");
}
else
CloseHandle(hProcess);
}
}