本次就完善一下进程控制。。做了一个简陋的任务管理器
本次学的几个东西:
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; }
年前再来转转!