在 C++ 中打开特定应用程序后如何关闭它?

Posted

技术标签:

【中文标题】在 C++ 中打开特定应用程序后如何关闭它?【英文标题】:How to close particular aplication after opening it in c++? 【发布时间】:2021-03-08 01:08:33 【问题描述】:

所以在我的代码中,我使用 ShellExecute 打开例如记事本,之后我想关闭它,但我找不到任何工作方式,所以我的问题是,使用 c++ 代码关闭特定应用程序的最简单方法是什么?

#include <iostream>
#include <Windows.h>

int main()


    ShellExecute(NULL, "open", "notepad", NULL, NULL, SW_SHOWDEFAULT);

    Sleep(10000);

    //here I'm missing the part that closes previously opened notepad

    return 0;



【问题讨论】:

使用ShellExecuteExCreateProcess 以便获得新启动进程的句柄。然后查看Using CreateProcess() and exit/close the opened Application。 似乎是这个帖子的重复问题; ***.com/questions/12972410/… @adarian 不,这不是重复的。那篇文章是关于关闭文件句柄的。 【参考方案1】:

您可以将ShellExecuteExSEE_MASK_NOCLOSEPROCESS 一起使用,然后您可以将其作为参数传递给TerminateProcess 函数。

这是一个示例:

#include <windows.h>

int main()

    SHELLEXECUTEINFO lpExecInfo;
    lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    lpExecInfo.lpFile = L"notepad.exe";
    lpExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    lpExecInfo.hwnd = NULL;
    lpExecInfo.lpVerb = NULL;
    lpExecInfo.lpParameters = NULL;
    lpExecInfo.lpDirectory = NULL;
    lpExecInfo.nShow = SW_SHOWNORMAL;
    ShellExecuteEx(&lpExecInfo);

    Sleep(3000);
    if (lpExecInfo.hProcess)
    
        TerminateProcess(lpExecInfo.hProcess, 0);
        CloseHandle(lpExecInfo.hProcess);
    
    return 0;

【讨论】:

这行代码中的'L'是什么意思` lpExecInfo.lpFile = L"notepad.exe"; `?当我使用整个代码时,它表明我无法将 const wchar_t 分配给 LPCSTR,当我删除这个“L”时,我可以运行程序而没有任何错误,但它不会关闭我的记事本 @Arrow25 因为我调用UNICODE的apiShellExecuteExW可能你的默认是ShellExecuteExA,当然我推荐你使用UNICDE版本。程序在这里可以正常关闭记事本,建议你重建程序试试看。 所以如果我的想法正确,我需要在 ide 中将编码类型更改为 unicode 才能正常工作? @Arrow25 不,它与您调用的 API 版本无关。你检查过lpExecInfo.hProcess 是空的吗?如果 TerminateProcess 函数返回 TRUE。 哦,好吧,我解决了我的问题,我不知道你也在调用记事本,我认为整个代码只是为了关闭它,我也在调用 ShellExecute 早期所以我有 2 个记事本,抱歉,我不知道这里使用的函数我需要阅读它们,删除“L”后一切正常,谢谢,“lpExecInfo”是否像分配给 SHELLEXECUTEINFO 的名称一样?

以上是关于在 C++ 中打开特定应用程序后如何关闭它?的主要内容,如果未能解决你的问题,请参考以下文章

关闭应用程序后,哈希图中的数据不保存

怎样用VB6 打开和关闭一个程序

控制和分析内存和时间消耗 C++ Windows 应用程序? [关闭]

在应用关闭时单击 Firebase 通知后打开特定的活动/片段

C++ 应用程序不会终止

如何打开关闭应用程序后打开的最后一个片段并使用导航抽屉和导航组件重新打开它