上次时演示例子是,输入进程的ID来杀死进程,作业内容就是输入进程名,以此来杀死进程.
我的思路:由于进程名与进程ID都是在PROCESSENTRY32的结构体中,所以当输入的进程名与PROCESSENTRY32结构体中的进程名szExeFile,进行比较时,若相同,则再调用 PROCESSENTRY32结构体中的进程ID th32ProcessID来杀死进程.
PS:虽说这个程序很简单,同学也很快就做出来了,但我可能是比较笨吧,花了一个下午,当然这其中也有看书温习的时间,做出来还是蛮高兴的.
/**********************获取正在运行的进程,并可杀死指定的进程********************/
/*********************查找进程为winword的名称,然后返回该进程的ID,然后将其杀死!*************/
#include <windows.h>
#include <tlhelp32.h> //快照函数的头文件
#include <stdio.h>
#include <string.h>
// TerminateProcessFromId()函数可以杀死指定了ID的进程
BOOL TerminateProcessFromId(DWORD dwId)
{
BOOL bRet = FALSE;
// 打开目标进程,取得进程句柄
HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId);
if(hProcess != NULL)
{
// 终止进程
bRet = ::TerminateProcess(hProcess, 0);
}
CloseHandle(hProcess);
return bRet;
}
int main(int argc , char* argv[])
{
/*************************显示系统进程**********************/
PROCESSENTRY32 pe32;
// 在使用pe32结构体前,必须要先定义其大小
pe32.dwSize = sizeof(pe32);
// 给系统中的所有进程拍一个快照
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS , 0);
// 若得到的句柄为非正常值,显示调用失败
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot 调用失败 !\n");
return -1;
}
// 遍历进程快照,轮流显示每个进程的信息
// Process32First用于首次调用,以后的调用由Process32Next来完成
BOOL bMore = ::Process32First (hProcessSnap , &pe32);
while(bMore)
{
printf("进程名称: %s\n ", pe32.szExeFile );
printf("进程ID号: %u \n\n", pe32.th32ProcessID );
bMore = ::Process32Next (hProcessSnap, &pe32);
}
// ::CloseHandle (hProcessSnap);
printf("输入你想要结束的进程名:");
char ProcessName[20]; //进程名
gets(ProcessName);
//puts(ProcessName);
BOOL result=NULL;
bMore = NULL;
// 通过Process32First与Process32Next来实现进程的遍历,以此来进行与ProcessName的比较
bMore = ::Process32First (hProcessSnap , &pe32);
while(bMore)
{
result = strcmp( ProcessName , pe32.szExeFile);
if(result==0)
{
if( TerminateProcessFromId(pe32.th32ProcessID) )
{ printf("成功杀死进程!\n");
bMore = 0;
return 0; // 成功杀死后,直接返回
}
}
bMore = ::Process32Next (hProcessSnap, &pe32);
}
printf("未能成功杀死进程!\n");
::CloseHandle (hProcessSnap);
return 0;
}
|
阅读(1513) | 评论(0) | 转发(0) |