windows平台指定关闭正在运行的exe

关闭exe

#include <filesystem>
#include <Windows.h>
#include <tlhelp32.h>
#include <iostream>
#include <vector>

// inexePath: 表示正在运行exe文件的绝对路径,是一个vector,表示可以传入多个需要关闭的exe,支持关闭多个
bool StopProcesses(const std::vector<std::string>& inexePaths) 
{
    bool result = false;
    std::vector<std::string> exePaths = inexePaths;
    for (auto exePath : exePaths) 
    {
        std::string inputFileName = std::filesystem::path(exePath).filename().string();
        // 将exePath转换为宽字符格式
        std::replace(exePath.begin(), exePath.end(), '/', '\\');
        wchar_t exePathWide[MAX_PATH];
        wchar_t exeName[MAX_PATH];
        // 将窄字符格式的文件名 inputFileName 转换为宽字符格式,并保存在 exeName 中。CP_UTF8 表示使用 UTF-8 编码。
        int numChars = MultiByteToWideChar(CP_UTF8, 0, inputFileName.c_str(), -1, exeName, MAX_PATH);
        if (numChars == 0) {
            std::cout << "Error: failed to convert exeName to wide char format, error code = " << GetLastError() << std::endl;
            return false;
        }
        //  将窄字符格式的路径 exePath 转换为宽字符格式,保存在 exePathWide 中。
        int numChars_2 = MultiByteToWideChar(CP_UTF8, 0, exePath.c_str(), -1, exePathWide, MAX_PATH);
        if (numChars_2 == 0) {
            std::cout << "Error: failed to convert exePath to wide char format, error code = " << GetLastError() << std::endl;
            return false;
        }

        // 创建进程快照句柄
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        if (hSnapshot == INVALID_HANDLE_VALUE) {
            std::cout << "Error: failed to create process snapshot handle, error code = " << GetLastError() << std::endl;
            return false;
        }

        // 初始化进程入口结构
        PROCESSENTRY32W processEntry;  // 定义一个用于遍历进程的结构体
        processEntry.dwSize = sizeof(PROCESSENTRY32W);  // 设置结构体的大小
        // 遍历流程列表
        BOOL bFound = Process32FirstW(hSnapshot, &processEntry);  // 使用 Process32FirstW 函数获取第一个进程的信息。
        while (bFound) {
            // 获取进程的完整路径
            if (wcscmp(processEntry.szExeFile, exeName) == 0)  // 区分大小写的比较
            {
                TCHAR fullPath[MAX_PATH];
                HANDLE tempprocessHandle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processEntry.th32ProcessID);
                if (tempprocessHandle != NULL) {
                    DWORD size = MAX_PATH;
                    if (QueryFullProcessImageName(tempprocessHandle, 0, fullPath, &size)) 
                    {
                        //std::cout << "Matched process: " << processEntry.szExeFile << " (PID: " << processEntry.th32ProcessID << ") Location: " << fullPath << std::endl;

                        // 比较完整路径与exePath
                        if (wcscmp(fullPath, exePathWide) == 0)
                        {
                            // 打开进程句柄
                            HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, processEntry.th32ProcessID);
                            if (hProcess != NULL) {
                                // 终止进程
                                if (TerminateProcess(hProcess, 0)) {
                                    std::cout << "Success: stopped process " << exePath << std::endl;
                                    result = true;
                                }
                                else 
                                {
                                    std::cout << "Error: stopped process " << exePath << std::endl;
                                    std::cout << "Error: failed to terminate process, error code = " << GetLastError() << std::endl;
                                }
                                // 关闭过程手柄
                                CloseHandle(hProcess);
                            }
                            else {
                                std::cout << "Error: failed to open process handle, error code = " << GetLastError() << std::endl;
                            }
                        }
                    }
                    CloseHandle(tempprocessHandle);
                }
                break;
            }
            bFound = Process32NextW(hSnapshot, &processEntry);
        }
        CloseHandle(hSnapshot);

        if (!result) 
        {
            std::cout << "Error: process " << exePath << " not found" << std::endl;
        }
    }

    return result;
}


  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值