#ifndef   CLOSE_PROCESS_HPP
#define   CLOSE_PROCESS_HPP

/*
*      杀掉所有名字等于指定的名称的进程。
*/

#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
#include <algorithm>

char* Wchar2Char(const wchar_t* wp)
{
    int len = WideCharToMultiByte(CP_ACP, 0, wp, wcslen(wp), NULL, 0, NULL, NULL);
    char* m_char = new char[len + 1];
    WideCharToMultiByte(CP_ACP, 0, wp, wcslen(wp), m_char, len, NULL, NULL);
    m_char[len] = '\0';
    return m_char;
}

BOOL KillProcessFromName(std::string strProcessName)
{
    //创建进程快照(TH32CS_SNAPPROCESS表示创建所有进程的快照) 
    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    //PROCESSENTRY32进程快照的结构体 
    PROCESSENTRY32 pe;
    //实例化后使用Process32First获取第一个快照的进程前必做的初始化操作 
    pe.dwSize = sizeof(PROCESSENTRY32);
    //下面的IF效果同: 
    //if(hProcessSnap == INVALID_HANDLE_VALUE) 无效的句柄 
    if (!Process32First(hSnapShot, &pe))
    {
        return FALSE;
    }
    //将字符串转换为小写 
    std::transform(strProcessName.begin(), strProcessName.end(), strProcessName.begin(), ::tolower);
    //如果句柄有效 则一直获取下一个句柄循环下去 
    while (Process32Next(hSnapShot, &pe))
    {
        char* pszTem = Wchar2Char(pe.szExeFile);
        //pe.szExeFile获取当前进程的可执行文件名称 
        std::string scTmp = std::string(pszTem);
        delete[] pszTem;
        //将可执行文件名称所有英文字母修改为小写 
        std::transform(scTmp.begin(), scTmp.end(), scTmp.begin(), ::tolower);
        //scTmp.MakeLower();
        //比较当前进程的可执行文件名称和传递进来的文件名称是否相同 
        //相同的话Compare返回0 
        if (scTmp == strProcessName)
        {
            //从快照进程中获取该进程的PID(即任务管理器中的PID) 
            DWORD dwProcessID = pe.th32ProcessID;
            HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessID);
            ::TerminateProcess(hProcess, 0);
            CloseHandle(hProcess);
            return TRUE;
        }
        //scTmp.ReleaseBuffer();
    }
    //strProcessName.ReleaseBuffer();
    return FALSE;
}
#endif