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

使用WindowsAPI关闭运行中的exe进程
本文介绍了如何使用C++和WindowsAPI,如`CreateToolhelp32Snapshot`、`Process32FirstW`和`TerminateProcess`等函数,来查找并关闭指定路径的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;
}


Windows 命令提示符中执行可执行文件(`.exe`)时,需要确保该文件的路径已被添加到系统环境变量中,或者提供完整的文件路径。以下是几种常见的方法: ### 1. 使用完整路径运行 `.exe` 文件 如果可执行文件不在系统环境变量 `PATH` 中,可以直接在命令提示符中输入该文件的完整路径来运行它。例如,如果 `example.exe` 位于 `C:\Program Files\Example` 目录下,可以使用以下命令: ```cmd "C:\Program Files\Example\example.exe" ``` 如果可执行文件所在的目录中包含空格,则必须使用引号将路径括起来,以确保命令提示符正确解析路径。 ### 2. 将可执行文件路径添加到系统环境变量 `PATH` 如果希望直接通过文件名调用 `.exe` 文件,而不需要输入完整路径,可以将该文件所在的目录添加到系统环境变量 `PATH` 中。完成此操作后,在命令提示符中输入文件名即可运行: ```cmd example.exe ``` 添加路径的方法如下: - 打开“系统属性” > “高级系统设置” > “环境变量”。 - 在“系统变量”部分找到 `PATH`,点击“编辑”。 - 添加可执行文件所在目录的路径,点击“确定”。 ### 3. 在当前目录下运行 `.exe` 文件 如果 `.exe` 文件位于当前命令提示符的工作目录中,可以直接运行文件。例如: ```cmd example.exe ``` 如果当前目录中没有该文件,则会提示 `'example.exe' 不是内部或外部命令,也不是可运行的程序或批处理文件。` 错误。 ### 4. 使用 `start` 命令运行 `.exe` 文件 可以使用 `start` 命令启动可执行文件,尤其适用于启动图形界面程序。例如: ```cmd start "" "C:\Program Files\Example\example.exe" ``` 其中,`""` 用于指定窗口标题(可为空),后面是可执行文件的完整路径。此方法确保命令提示符不会等待程序结束,而是立即返回命令行提示符。 ### 5. 通过 `cmd /c` 或 `cmd /k` 运行 `.exe` 文件 如果需要在新命令行窗口中运行 `.exe` 文件,可以使用 `cmd /c` 或 `cmd /k` 命令。`/c` 表示运行命令后关闭窗口,`/k` 表示运行命令后保持窗口打开。例如: ```cmd cmd /c "C:\Program Files\Example\example.exe" ``` ### 6. 使用 `call` 命令运行 `.exe` 文件 `call` 命令用于调用另一个批处理文件或可执行文件,并在执行完成后返回当前脚本继续执行。例如: ```cmd call "C:\Program Files\Example\example.exe" ``` 这种方法适用于批处理脚本中,确保在调用 `.exe` 文件后继续执行后续命令。 ### 注意事项 - 如果 `.exe` 文件需要管理员权限运行,可以在命令提示符中以管理员身份打开后再执行命令。 - 确保路径中没有拼写错误,否则命令提示符无法找到可执行文件[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值