2025-11-27 16:46:48 +09:00

372 lines
9.3 KiB
C++

// ProcessesDialog.cpp : implementation file
//
#include "stdafx.h"
#include "systemstateinfo.h"
#include "ProcessesDialog.h"
#include "OXSysInfo.h"
#include "OXProcess.h"
#include "UTBStrOp.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CProcessesDialog dialog
CProcessesDialog::CProcessesDialog() : CPageDialog()
{
//{{AFX_DATA_INIT(CProcessesDialog)
m_nExpandLevel = 0;
m_nExpandType = 1;
//}}AFX_DATA_INIT
}
void CProcessesDialog::DoDataExchange(CDataExchange* pDX)
{
CPageDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CProcessesDialog)
DDX_Control(pDX, IDC_SPIN_EXPANDLEVEL, m_spinExpandLevel);
DDX_Control(pDX, IDC_EDIT_EXPANDLEVEL, m_editExpandLevel);
DDX_Control(pDX, IDC_TREE_PROCESSES, m_tree);
DDX_Text(pDX, IDC_EDIT_EXPANDLEVEL, m_nExpandLevel);
DDX_Radio(pDX, IDC_RADIO_EXPANDLEVEL, m_nExpandType);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CProcessesDialog, CPageDialog)
//{{AFX_MSG_MAP(CProcessesDialog)
ON_BN_CLICKED(IDC_RADIO_EXPANDALL, OnRadioExpandall)
ON_BN_CLICKED(IDC_RADIO_EXPANDLEVEL, OnRadioExpandlevel)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CProcessesDialog message handlers
void CProcessesDialog::OnInitDialog()
{
CPageDialog::OnInitDialog();
// TODO: Add your specialized creation code here
m_ilTree.Create(IDB_PROCESSES_TREE_IMAGE,16,1,RGB(255,0,255));
m_tree.SetImageList(&m_ilTree,TVSIL_NORMAL);
LV_COLUMN lvc={ sizeof(lvc) };
lvc.fmt=LVCFMT_LEFT;
lvc.cx=237;
lvc.pszText=_T("Process image name");
lvc.mask = LVCF_FMT|LVCF_WIDTH|LVCF_TEXT;
m_tree.SetColumn(0,&lvc);
m_tree.InsertColumn(1,_T("Process ID"),LVCFMT_LEFT,200,1);
// set COXTreeCtrl styles
m_tree.ModifyExStyle(0,TVOXS_PICKANYWHERE|TVOXS_ROWSEL);
m_tree.ModifyStyle(0,TVS_SHOWSELALWAYS|TVS_HASBUTTONS|
TVS_HASLINES|TVS_LINESATROOT);
// spin control
m_spinExpandLevel.SetRange(0,1);
m_spinExpandLevel.SetPos(0);
// layout manager
//
m_LayoutManager.Attach(this);
// tree control
m_LayoutManager.TieChild(IDC_TREE_PROCESSES,OX_LMS_ANY,OX_LMT_SAME);
//////////////////
// radio buttons and expand level edit control
m_LayoutManager.TieChild(IDC_RADIO_EXPANDALL,
OX_LMS_LEFT|OX_LMS_BOTTOM,OX_LMT_SAME);
m_LayoutManager.TieChild(IDC_RADIO_EXPANDLEVEL,
OX_LMS_LEFT|OX_LMS_BOTTOM,OX_LMT_SAME);
m_LayoutManager.TieChild(IDC_EDIT_EXPANDLEVEL,OX_LMS_LEFT,
OX_LMT_OPPOSITE,IDC_RADIO_EXPANDLEVEL);
m_LayoutManager.TieChild(IDC_EDIT_EXPANDLEVEL,OX_LMS_BOTTOM,OX_LMT_SAME);
m_LayoutManager.TieChild(IDC_SPIN_EXPANDLEVEL,OX_LMS_LEFT,
OX_LMT_OPPOSITE,IDC_EDIT_EXPANDLEVEL);
m_LayoutManager.TieChild(IDC_SPIN_EXPANDLEVEL,OX_LMS_BOTTOM,OX_LMT_SAME);
//////////////////
//////////////////////////////////////
PopulateTree();
ShowControls();
}
void CProcessesDialog::Refresh()
{
PopulateTree();
}
void CProcessesDialog::PopulateTree()
{
if(!UpdateData())
return;
CWaitCursor waitCursor;
COXProcessIterator processIterator;
if(!processIterator.MakeSnapshot())
return;
m_tree.SetRedraw(FALSE);
m_tree.DeleteAllItems();
// create fonts to customize tree items appearance
LOGFONT lf;
CFont fontRoot;
CFont fontSubRoot;
CFont* pFontRoot=GetFont();
if(pFontRoot->GetLogFont(&lf))
{
lf.lfHeight=-14;
UTBStr::tcsncpy(lf.lfFaceName,LF_FACESIZE,_T("Arial"),LF_FACESIZE);
fontRoot.CreateFontIndirect(&lf);
lf.lfHeight=-12;
lf.lfWeight=FW_BOLD;
UTBStr::tcsncpy(lf.lfFaceName,LF_FACESIZE,_T("Times New Roman"),LF_FACESIZE);
fontSubRoot.CreateFontIndirect(&lf);
}
pFontRoot=((HFONT)fontRoot!=NULL) ? &fontRoot : NULL;
CFont* pFontSubRoot=((HFONT)fontSubRoot!=NULL) ? &fontSubRoot : NULL;
CString sValue;
HTREEITEM htiRoot;
HTREEITEM htiItem;
COLORREF clrTopic=RGB(0,0,255);
COLORREF clrValue=RGB(0,128,0);
COXSysInfo m_SysInfo;
HTREEITEM htiSelectItem=NULL;
///////////////////////////////////////////////////
//
for(int nIndex=0; nIndex<processIterator.GetProcessCount(); nIndex++)
{
if(processIterator.IsValid() && processIterator.GetImageFileName(sValue))
{
ASSERT(!sValue.IsEmpty());
if(sValue.Find(_T("\\??\\"))==0)
sValue=sValue.Mid(4);
CString sFullPath=sValue;
// process image name and ID
int nLastBackslashPos=sValue.ReverseFind('\\');
if(nLastBackslashPos!=-1)
sValue=sValue.Mid(nLastBackslashPos+1);
htiRoot=InsertItem(sValue,NULL,0,pFontRoot,clrTopic);
if(htiSelectItem==NULL)
htiSelectItem=htiRoot;
sValue.Format(_T("%u"),processIterator.GetProcessID());
VERIFY(m_tree.SetSubItem(htiRoot,1,
OX_SUBITEM_FONT|OX_SUBITEM_TEXT|OX_SUBITEM_COLOR,
sValue,0,pFontSubRoot,RGB(0,0,0)));
// full process image path
CString sWindowsDirTag=_T("\\SystemRoot");
CString sWindowsDir;
if(!m_SysInfo.GetWindowsDir(&sWindowsDir))
sWindowsDir.Empty();
if(!sWindowsDir.IsEmpty() && sFullPath.Find(sWindowsDirTag)==0)
sFullPath=sWindowsDir+sFullPath.Mid(sWindowsDirTag.GetLength());
htiItem=InsertItem(_T("Full Image Path"),htiRoot);
VERIFY(m_tree.SetSubItem(htiItem,1,OX_SUBITEM_TEXT|OX_SUBITEM_COLOR,
sFullPath,0,NULL,clrValue));
VERIFY(m_tree.SetItemDrawEllipsis(htiItem,DT_PATH_ELLIPSIS,1));
// process priority class
DWORD dwPriorityClass;
if(processIterator.GetPriorityClass(dwPriorityClass))
{
htiItem=InsertItem(_T("Priority Class"),htiRoot);
switch(dwPriorityClass)
{
case HIGH_PRIORITY_CLASS:
sValue.Format(_T("HIGH_PRIORITY_CLASS (%d)"),dwPriorityClass);
break;
case IDLE_PRIORITY_CLASS:
sValue.Format(_T("IDLE_PRIORITY_CLASS (%d)"),dwPriorityClass);
break;
case NORMAL_PRIORITY_CLASS:
sValue.Format(_T("NORMAL_PRIORITY_CLASS (%d)"),dwPriorityClass);
break;
case REALTIME_PRIORITY_CLASS:
sValue.Format(_T("REALTIME_PRIORITY_CLASS (%d)"),dwPriorityClass);
break;
default:
sValue.Format(_T("Unknown (%d)"),dwPriorityClass);
break;
}
VERIFY(m_tree.SetSubItem(htiItem,1,OX_SUBITEM_TEXT|OX_SUBITEM_COLOR,
sValue,0,NULL,clrValue));
}
// process version
DWORD dwVersion;
if(processIterator.GetVersion(dwVersion) && dwVersion>0)
{
htiItem=InsertItem(_T("Version"),htiRoot);
sValue.Format(_T("%d.%d"),HIWORD(dwVersion),LOWORD(dwVersion));
VERIFY(m_tree.SetSubItem(htiItem,1,OX_SUBITEM_TEXT|OX_SUBITEM_COLOR,
sValue,0,NULL,clrValue));
}
// priority boost
BOOL bDisabled;
if(processIterator.IsPriorityBoostDisabled(bDisabled))
{
htiItem=InsertItem(_T("Priority Boost"),htiRoot);
sValue=(bDisabled ? _T("Disabled") : _T("Enabled"));
VERIFY(m_tree.SetSubItem(htiItem,1,OX_SUBITEM_TEXT|OX_SUBITEM_COLOR,
sValue,0,NULL,clrValue));
}
// creation time
COleDateTime oleDateTime;
if(processIterator.GetCreationTime(oleDateTime))
{
htiItem=InsertItem(_T("Creation Time"),htiRoot);
sValue=oleDateTime.Format();
VERIFY(m_tree.SetSubItem(htiItem,1,OX_SUBITEM_TEXT|OX_SUBITEM_COLOR,
sValue,0,NULL,clrValue));
}
// kernel time
DWORDLONG timeSpent;
if(processIterator.GetKernelTime(timeSpent) && timeSpent>0)
{
htiItem=InsertItem(_T("Kernel Time"),htiRoot);
sValue.Format(_T("%d ms"),timeSpent/10000);
VERIFY(m_tree.SetSubItem(htiItem,1,OX_SUBITEM_TEXT|OX_SUBITEM_COLOR,
sValue,0,NULL,clrValue));
}
// user time
if(processIterator.GetUserTime(timeSpent) && timeSpent>0)
{
htiItem=InsertItem(_T("User Time"),htiRoot);
sValue.Format(_T("%d ms"),timeSpent/10000);
VERIFY(m_tree.SetSubItem(htiItem,1,OX_SUBITEM_TEXT|OX_SUBITEM_COLOR,
sValue,0,NULL,clrValue));
}
}
++processIterator;
}
//
////////////////////////////////////////////////
ExpandTree((m_nExpandType==0 ? m_nExpandLevel : -1));
m_tree.SetFocus();
m_tree.SelectItem(htiSelectItem);
m_tree.SetRedraw(TRUE);
}
void CProcessesDialog::ExpandTree(int nExpandLevel/*=-1*/,
HTREEITEM htiParent/*=NULL*/)
{
if(nExpandLevel==0)
return;
if(htiParent==NULL)
{
htiParent=m_tree.GetRootItem();
ASSERT(htiParent!=NULL);
}
HTREEITEM hti=m_tree.GetNextItem(htiParent,TVGN_CHILD);
while(hti!=NULL)
{
m_tree.Expand(hti,TVE_EXPAND);
COXTreeItem* xti=m_tree.GetXItem(hti);
ASSERT(xti!=NULL);
if(xti->ItemHasChildren())
ExpandTree((nExpandLevel==-1 ? -1 : nExpandLevel-1),hti);
hti=m_tree.GetNextItem(hti,TVGN_NEXT);
}
}
HTREEITEM CProcessesDialog::InsertItem(CString sItem, HTREEITEM htiParent/*=NULL*/,
int nImage/*=-1*/, CFont* pFont/*=NULL*/,
COLORREF clr/*=CLR_NONE*/)
{
HTREEITEM hti=m_tree.InsertItem(sItem,htiParent);
ASSERT(hti!=NULL);
// associate new font
if(pFont!=NULL)
VERIFY(m_tree.SetItemFont(hti,pFont));
// and new color
if(clr!=CLR_NONE)
VERIFY(m_tree.SetItemColor(hti,clr));
m_tree.SetItemImage(hti,nImage,nImage);
return hti;
}
void CProcessesDialog::ShowControls()
{
if(UpdateData())
{
CWnd* pDlgItem=GetDlgItem(IDC_EDIT_EXPANDLEVEL);
ASSERT(pDlgItem!=NULL);
pDlgItem->EnableWindow((m_nExpandType==0));
pDlgItem=GetDlgItem(IDC_SPIN_EXPANDLEVEL);
ASSERT(pDlgItem!=NULL);
pDlgItem->EnableWindow((m_nExpandType==0));
}
}
void CProcessesDialog::OnRadioExpandall()
{
// TODO: Add your control notification handler code here
ShowControls();
}
void CProcessesDialog::OnRadioExpandlevel()
{
// TODO: Add your control notification handler code here
ShowControls();
}