Chinaunix首页 | 论坛 | 博客
  • 博客访问: 309822
  • 博文数量: 73
  • 博客积分: 1850
  • 博客等级: 上尉
  • 技术积分: 757
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-18 16:12
文章分类

全部博文(73)

文章存档

2011年(8)

2010年(26)

2009年(39)

分类:

2009-09-02 21:45:20

上次时演示例子是,输入进程的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) |
给主人留下些什么吧!~~