制作任务管理器Demo--CreateToolHelp32Snapshot函数

在这里我们首先需要用到一个可以列出所有进程的一个函数CreateToolelp32Snapshot函数,函数包含在头中,在帮助文档中,函数的具体格式如下

HANDLE WINAPI CreateToolhelp32Snapshot(
                    _In_  DWORD dwFlags,
                    _In_  DWORD th32ProcessID
);

其中参数的意义如下:

dwFlags:指定系统获取进程快照的类型

th32ProcessID:指定要获取进程快照的ID,获取系统内所有进程快照ID时是0

在这里我们要获取进程快照的ID,第一个参数传入TH32CS_SNAPPROCESS 

如果函数调用成功返回快照句柄,否则返回INVALID_HANDLE_VALUE,在得到系统进程快照句柄之后,需要调用Process32First函数查找系统进程快照中的第一个进程。函数格式如下:

BOOL Process32First(  
                    HANDLE hSnapshot,  
                    LPROCESSENTRY32 lppe  
                   );  

hSnapshot:传入调用CreateToolHelp32Snapshot函数调用成功返回的句柄

lppe:是指向PROCESSENTRY的结构体指针,进程的详细信息保存在结构体中。

PROCESSENTRY32结构体定义如下:

typedef struct tagPROCESSENTRY32 {  
                                  DWORD dwSize;//结构大小  
                                  DWORD cntUsage;//此进程的引用计数  
                                  DWORD th32ProcessID;//进程ID  
                                  DWORD th32DefaultHeapID;//进程默认堆ID  
                                  DWORD th32ModuleID;//进程模块ID  
                                  DWORD cntThreads;//此进程开启的线程计数  
                                  DWORD th32ParentProcessID;//父进程ID  
                                  LONG pcPriClassBase;//线程优先权  
                                  DWORD dwFlags;//保留  
                                  char szExeFile[MAX_PATH];//进程名  
                                } PROCESSENTRY32; 

所以我们可以 定义一个结构体,注意PROCESSENTRY32结构体定义时,其他值可以默认为0,但是 dwSize结构体大小一定要赋初值。

PROCESSENTRY32 pe={sizeof(PROCESSENTRY32)};

再调用Process32Next函数列出系统中其它进程,格式如下:

BOOL Process32Next(  
                    HANDLE hSnapshot,  
                    LPROCESSENTRY32 lppe  
                   );  

Process32First和Process32Next的参数是一样的。

当上述两个函数列举到进程时返回TRUE,否则返回FALSE。当列举到一个进程时lppe参数就会返回进程的详细信息,所以用户就可以读取这些进程的信息,然后输出。

下面是具体过程:

在MFC下建立一个TaskManger的基于对话框项目,在工具栏中拉过来一个List Control 控件,右键添加变量,定义为m_ProcessList

制作任务管理器Demo--CreateToolHelp32Snapshot函数_第1张图片

在TaskMangerDlg.h中添加一个 ShowProcess函数,并在初始化的位置调用

下面是ShowProcess实现的完整代码

void CTaskMangerDlg::ShowProcess()
{
	
	 
	 //1获取链表
	HANDLE hprocess=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
	if(hprocess==INVALID_HANDLE_VALUE)
	{
	return;
	}
	//2获得表头
	PROCESSENTRY32 pe={sizeof(PROCESSENTRY32)};
	bool bprocess=Process32First(hprocess,&pe);
	TCHAR szbuf[20]={0};
	while(bprocess)
	{   
		
		m_ProcessList.InsertItem(0,pe.szExeFile);

		_itow_s(pe.th32ProcessID,szbuf,sizeof(szbuf)/sizeof(TCHAR),10);
		m_ProcessList.SetItemText(0,1,szbuf);


		_itow_s(pe.cntThreads ,szbuf,sizeof(szbuf)/sizeof(TCHAR),10);
		m_ProcessList.SetItemText(0,2,szbuf);



		bprocess= Process32Next(hprocess,&pe);
	}
	//3遍历链表
	

}

点击按钮杀死进程的完整代码:

void CTaskMangerDlg::OnBnClickedButton1()
{
	int nIndexID=m_ProcessList.GetSelectionMark();
	if(nIndexID==-1)return;
	CString strid=m_ProcessList.GetItemText(nIndexID,1);
	int nID=_wtoi(strid);
	HANDLE hOpenProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,nID);

	if(hOpenProcess)
	{
		TerminateProcess(hOpenProcess,-1);
	m_ProcessList.DeleteItem(nIndexID);
	}


	
	
	// TODO: 在此添加控件通知处理程序代码
}

最后效果显示

制作任务管理器Demo--CreateToolHelp32Snapshot函数_第2张图片


你可能感兴趣的:(操作系统)