⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 processmgdlg.cpp

📁 VisualC高级编程技术精粹.rar
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	CAboutDlg dlg;
	dlg.DoModal();	
}

CString CProcessMgDlg::GetProcessCreateTime(DWORD dwID,int i)
{
    char szHour[5];
	char szMinute[5];
	char szSecond[5];
	FILETIME CPUTime;
	FILETIME CreateTime;
	FILETIME ExitTime;
	FILETIME KernelTime;
	FILETIME UserTime;
	SYSTEMTIME SystemTime;

	HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwID);
	if (hProcess == 0)
	{		
		return -1;
	}
	else
	{
		if (!GetProcessTimes(hProcess,&CreateTime,&ExitTime,
			&KernelTime,&UserTime))
		{			
			return -1;
		}
		else
		{
			CPUTime.dwHighDateTime =  CreateTime.dwHighDateTime;
			CPUTime.dwLowDateTime =  CreateTime.dwLowDateTime;
			FileTimeToSystemTime(&CPUTime,&SystemTime);			
			
			wsprintf(szHour,"%.2d",(SystemTime.wHour+8)%24);
			wsprintf(szMinute,"%.2d",SystemTime.wMinute);
			wsprintf(szSecond,"%.2d",SystemTime.wSecond);						
		}
	}

	if (i == 1)
	{
		return szHour;
	}

	if (i == 2)
	{
		return szMinute;
	}

	if (i == 3)
	{
	    return szSecond;
	}

    return _T("");
}

void CProcessMgDlg::OnButtonThread() 
{
	// TODO: Add your control notification handler code here
	CThreadDlg ThreadDlg;

	ThreadDlg.m_parent = this;
	int nItem = m_listctrlProcess.GetNextItem( -1, 
		                      LVNI_ALL | LVNI_SELECTED);
	m_csPID = m_listctrlProcess.GetItemText(nItem,1);

	if( m_csPID.IsEmpty() )
	{		
		AfxMessageBox(_T("^_^     请先选择一进程"));
		return;
	}
	
	ThreadDlg.DoModal();	
}

void CProcessMgDlg::OnButtonModule() 
{
	// TODO: Add your control notification handler code here
	CModuleDlg ModuleDlg;
	ModuleDlg.m_parent = this;

	int nItem = m_listctrlProcess.GetNextItem( -1, LVNI_ALL | LVNI_SELECTED);
	m_csCID = m_listctrlProcess.GetItemText(nItem,1);
	if (m_csCID.IsEmpty())
	{		
		AfxMessageBox("^_^     请先选择一进程");
		return;
	}

	ModuleDlg.DoModal();

	// 获取当前行行号
	DWORD id = atol(m_csCID);
	
	UpdateData(FALSE);                                	
}

void CProcessMgDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{	
	CDialog::OnLButtonDown(nFlags, point);
}

void CProcessMgDlg::OnClickListTotal(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);

	int nItem = m_listctrlProcess.GetNextItem( -1, LVNI_ALL | LVNI_SELECTED);
	m_csCID= m_listctrlProcess.GetItemText(nItem,1);
	DWORD dwPID = atol(m_csCID);
	m_csHour = GetProcessCreateTime(dwPID,1);
	m_csMinute = GetProcessCreateTime(dwPID,2);
	m_csSecond = GetProcessCreateTime(dwPID,3);
	UpdateData(FALSE);
	
	*pResult = 0;
}

void CProcessMgDlg::OnTimer(UINT nIDEvent) 
{
    // 显示系统时间
    DisplaySystemTime();
    
	CDialog::OnTimer(nIDEvent);
}

BOOL CProcessMgDlg::DestroyWindow() 
{
	return CDialog::DestroyWindow();
}

void CProcessMgDlg::UpdateProcess()
{
	UpdateData(TRUE);
	m_listctrlProcess.DeleteAllItems(); // 清空列表
	
	DWORD idxList = 1;
	int nCount = 0;
	HANDLE hProcess;
	char szCount[56];

	PROCESSENTRY32 pe32;
	pe32.dwSize = sizeof(pe32);
	HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

	if (hProcessSnap == INVALID_HANDLE_VALUE)
	{
		AfxMessageBox(_T("^_^     CreateToolhelp32Snapshot调用失败"));
		return;
	}

	BOOL bMore = ::Process32First(hProcessSnap,&pe32);

	while (bMore)
	{		
		m_listctrlProcess.InsertItem(1,pe32.szExeFile);
		wsprintf(szID,_T("%u"),pe32.th32ProcessID);
		wsprintf(szCount,_T("%u"),pe32.cntThreads);
		m_listctrlProcess.SetItemText(idxList,1,szID);
		hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32.th32ProcessID);

		m_listctrlProcess.SetItemText(idxList,2,GetProcessPriority(hProcess));
		m_listctrlProcess.SetItemText(idxList,4,GetProcessPath(pe32.th32ProcessID));
		m_listctrlProcess.SetItemText(idxList,3,szCount);

		nCount++;

		bMore = ::Process32Next(hProcessSnap,&pe32);				
	}

	::CloseHandle(hProcessSnap);
	char szNum[5];
	wsprintf(szNum,_T("%d"),nCount);
	m_nNumberofProcess = szNum;

	UpdateData(FALSE);
}

void CProcessMgDlg::OnSystemQuit() 
{
    CDialog::OnCancel();
}

void CProcessMgDlg::DisplaySystemTime()
{
    CTime time = CTime::GetCurrentTime();
	CString csDate = time.Format(_T("今天是:%Y年%m月%d日"));

    // 在状态栏上显示时间
	m_statusbar.SetText( csDate, 1, 1 );
}

void CProcessMgDlg::OnRclickListTotal(NMHDR* pNMHDR, LRESULT* pResult) 
{
    POSITION pos = m_listctrlProcess.GetFirstSelectedItemPosition();
	if( NULL == pos )
	{
		// 提示先选择进程	
		AfxMessageBox(_T("^_^     请先选择一进程"));
		return;
	}

    int nIndexInFieldList = 0;
    while (pos)
	{ 	
		// Get index of the selected item
		nIndexInFieldList = m_listctrlProcess.GetNextSelectedItem(pos);

	    m_csPID = m_listctrlProcess.GetItemText( nIndexInFieldList, 1 );
	    
	    if( m_csPID.IsEmpty() )
	    {
			AfxMessageBox(_T("^_^     没有可被终止的进程"));
		    return;
	    }
    }

    int ret = MessageBox( _T("^_^     你真想结束该进程吗?"), _T("友情询问"), 
		                 MB_ICONASTERISK|MB_YESNO );
    if( ret != IDYES )
    {
        return ;
    }

    OnButtonTerminate(); 
	
	*pResult = 0;
}

void CProcessMgDlg::OnButtonNewprocess() 
{
	// TODO: Add your control notification handler code here
	CString csFileName;
	CFileDialog fDlg(TRUE,NULL,NULL,
		             OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
		             _T("Executable files(*.exe)|*.exe|All files (*.*)|*.*||"));
	if (fDlg.DoModal() == IDOK)
	{
		csFileName = fDlg.GetPathName();
	}
	else
	{
		return;
	}

	STARTUPINFO si = {sizeof(si)} ;
	si.dwFlags = STARTF_USESHOWWINDOW;
	si.wShowWindow = TRUE;
	PROCESS_INFORMATION pi;
	char *buf;
	buf = csFileName.GetBuffer(100);
	
	// 新建一个进程
	BOOL bRet = ::CreateProcess(NULL,
		                        buf,
		                        NULL,
		                        NULL,
		                        FALSE,
		                        NORMAL_PRIORITY_CLASS,
		                        NULL,
		                        NULL,
		                        &si,
		                        &pi);
	// 更新进程
	OnButtonUpdateprocess(); 
}

void CProcessMgDlg::OnButtonTerminate() 
{
	// TODO: Add your control notification handler code here
	CString m_csPID = _T("");
	
    // 取得第一个位置
	POSITION pos = m_listctrlProcess.GetFirstSelectedItemPosition();
	if (NULL == pos)
	{
		// 提示选择进程
		AfxMessageBox("^_^     请先选择一进程");
		return;
	}		

	int nIndexInFieldList = 0;
    while (pos)
	{ 	
		// 取得选择项目的索引
		nIndexInFieldList = m_listctrlProcess.GetNextSelectedItem(pos);

	    m_csPID = m_listctrlProcess.GetItemText( nIndexInFieldList, 1 );
	    
	    if( m_csPID.IsEmpty())
	    {
		    AfxMessageBox("^_^      没有可显示的进程");
		    return;
	    }

		// 为选择项设定焦点
		m_listctrlProcess.SetFocus();
		
		TerminateProcessID( atol(m_csPID) );

        // 删除被选择的项目
		m_listctrlProcess.DeleteItem( nIndexInFieldList );

		// 重新取得第一个位置
		pos = m_listctrlProcess.GetFirstSelectedItemPosition();
	}

    // 更新进程
	OnButtonUpdateprocess();
}

void CProcessMgDlg::OnButtonUpdateprocess() 
{
	// TODO: Add your control notification handler code here
	UpdateProcess();

	return;
}

void CProcessMgDlg::OnButtonClear() 
{
	// TODO: Add your control notification handler code here
	m_listctrlProcess.DeleteAllItems();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -