Icebound

icebound-area

智障学写程序系列②【不定期更新】

本次就完善一下进程控制。。做了一个简陋的任务管理器
本次学的几个东西:
1 用toolhelp工具获得系统快照
2 用OpenProcess获取进程句柄
3 用TerminateProcess关闭进程

首先是利用toolhelp工具可以轻松获取当前系统的进程列表
toolhelp里面有个snapshot对象,可以给当前系统拍个快照
利用这个快照 我们就可以把进程都列出来了
通过CreateToolhelp32Snapshot函数获取快照
这个函数有两个参数 第一个是返回对象 可以是TH32CS_SNAPPROCESS 就是获取进程
当然也可以TH32CS_SNAPTHREAD获取线程 还有其他的
第二个参数如果设成0就是获取全局的
利用Process32First和Process32Next遍历快照
Process32First定位到快照中的第一个信息 Process32Next定位到下一个信息
返回值都是bool

用PROCESSENTRY这个结构体接收信息
这个结构体麻烦的一比。。
dwSize是必须要预先设置的 设置成默认就行了
th32ProcessID是进程ID szExeFile是进程对应的exe的名字
通过这一系列的东西就可以搞了。。

然后说说OpenProcess 这个可以获取某个进程的句柄
三个参数:权限类型,句柄是否可以被继承,id号
但是这个有可能被拒绝访问。。。

最后就是TerminateProcess
两个参数 句柄,退出代码
很好理解
于是我乱搞了个任务管理器出来。。。
首先通过toolhelp获取进程列表
然后输入stop [id]就是关闭某个id
run [名字] 就是启动某个进程
就是这样。。。
然后又是丑的一比的代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<windows.h>
#include<tlhelp32.h> 
using namespace std;
//2016 01 31
bool GetSnap()
{
	PROCESSENTRY32 pe;
	pe.dwSize=sizeof pe;
	HANDLE hps=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
	if(hps==INVALID_HANDLE_VALUE){cout<<"error"<<endl;return 0;}
	bool bMore=::Process32First(hps,&pe);
	while(bMore)
	{
		cout<<"name: "<<pe.szExeFile<<endl;
		cout<<"ID: "<<pe.th32ProcessID<<endl;
		bMore=::Process32Next(hps,&pe);
	}
	::CloseHandle(hps);
	return 1;
}
void StopProc(int id)
{
	int ret=0;
	HANDLE hp=::OpenProcess(PROCESS_ALL_ACCESS,0,id);
	if(hp!=NULL)ret=TerminateProcess(hp,0);
	::CloseHandle(hp);
	if(!ret)cout<<"can't stop"<<endl;
	else cout<<"stop complete"<<endl;
}
char command[200];
void OpenProc()
{
	getchar();
	PROCESS_INFORMATION p;
	STARTUPINFO s={(sizeof s)};
	gets(command);
	s.dwFlags=STARTF_USESHOWWINDOW;
	s.wShowWindow=1;
	bool ret=CreateProcess(
		NULL,
		command,
		NULL,
		NULL,
		0,
		CREATE_NEW_CONSOLE,
		NULL,
		NULL,
		&s,
		&p);
	if(!ret)cout<<"error"<<endl;
	else cout<<"ok!"<<endl;
}
int main(int argc,char* argv[])
{
	if(!GetSnap())return 0;
	while(1)
	{
		cout<<endl;
		cout<<"please input:"<<endl;
		string inp;cin>>inp;int id;
		if(inp=="stop")cin>>id,StopProc(id);
		else if(inp=="test")
		{
			for(int i=1;i<=100;i++)
			{
				system("color ce");
				system("color 0f");
			}
		}
		else if(inp=="run")OpenProc();
		else cout<<"error"<<endl;
		system("pause");
		system("cls");
		if(!GetSnap())return 0;
	}
	return 0;
}

 

  1. 94300说道:

    年前再来转转!