在 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;
【问题讨论】:
使用ShellExecuteEx
或CreateProcess
以便获得新启动进程的句柄。然后查看Using CreateProcess() and exit/close the opened Application。
似乎是这个帖子的重复问题; ***.com/questions/12972410/…
@adarian 不,这不是重复的。那篇文章是关于关闭文件句柄的。
【参考方案1】:
您可以将ShellExecuteEx
与SEE_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++ 中打开特定应用程序后如何关闭它?的主要内容,如果未能解决你的问题,请参考以下文章
控制和分析内存和时间消耗 C++ Windows 应用程序? [关闭]