//刷新
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總數沒有變化,則無需更新列表
if (NewProcessTotal==OldProcessTotal)
return;
//全部清除
m_list.DeleteAllItems();
m_imagelist.DeleteImageList( );
//設置圖標
m_imagelist.Create(16,16,ILC_COLORDDB,2,2); //創建CImageList 16,16是圖標的大小
m_list.SetImageList(&m_imagelist,LVSIL_SMALL);//把CListCtrl中的CImageList聯
int nItem=0;
HANDLE hProcess = NULL; //進程句柄
TCHAR szProcessName[MAX_PATH] ={0}; //進程的名稱
TCHAR szProcessPath[MAX_PATH] ={0}; //進程路徑
HMODULE hMod=NULL; //進程的第一個模塊
DWORD ModulecbNeeded; //儲存進程模塊的大小
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) ) // 列舉某個進程的模塊,第一個模塊就是創建此進程的主exe程序
{
if ( GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) ) //獲得程序名
&& GetModuleFileNameEx( hProcess, hMod, szProcessPath, sizeof(szProcessPath)) )//獲得模塊路徑
{
//獲取圖標
:: SHGetFileInfo(szProcessPath,0, &stFileInfo,sizeof(stFileInfo),SHGFI_ICON|SHGFI_SMALLICON ); //添加圖標到m_imagelist (CImageList m_imagelist)
//向m_imagelist添加圖標
int n=m_imagelist.Add(stFileInfo.hIcon);
//把程序名,路徑,進程ID添加到ClistCtrl
m_list.InsertItem(nItem, szProcessName,n);//插入1行"11"代表第0列的數據 參數(行數,標題,圖標索引)
m_list.SetItemText(nItem, 2, szProcessPath);
//更新Processdata[nItem].ID
Processdata[nItem].ID=NewProcessID[i];
//更新進程CPU使用率
m_list.SetItemText(nItem, 1, itoa( GetProcessUsage(&Processdata[nItem]) ,buf,10) );
//改變nItem
nItem++;
}
}
CloseHandle(hProcess);
}
//更新OldProcessID
OldProcessTotal=NewProcessTotal;
}
//刪除進程
void CTaskerDlg::OnDeleteProcess()
{
//獲得選中的行
int nItem;
POSITION pos = m_list.GetFirstSelectedItemPosition();
if (pos != NULL)
while (pos)
nItem=m_list.GetNextSelectedItem(pos);
//關閉進程
HANDLE hProcess = OpenProcess( PROCESS_TERMINATE, FALSE, Processdata[nItem].ID );
if( NULL != hProcess )
{
if(IDOK==MessageBox("確定要刪除此進程嗎?","提示",MB_OKCANCEL) )
{
if( TerminateProcess( hProcess, 0 ) )
{
CloseHandle( hProcess );
//刪除CListCtrl上的項
m_list.DeleteItem(nItem);
}
else
MessageBox("不能結束進程!");
}
else
CloseHandle(hProcess);
}
}