如何优雅地停止使用 CreateProcessW 和选项 CREATE_NEW_CONSOLE 创建的进程?
How can I gracefully stop a process created with CreateProcessW and option CREATE_NEW_CONSOLE?
在我的应用程序的某个地方,我正在创建一个这样的进程:
STARTUPINFO startupInfo;
ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION processInfo;
ZeroMemory(&processInfo, sizeof(processInfo));
const auto created = CreateProcessW(
pathToExe,
cmdLine,
nullptr,
nullptr,
false,
CREATE_NEW_CONSOLE,
nullptr,
workingDir,
&startupInfo,
&processInfo);
我这里的exe是运行控制台应用
稍后,我想优雅地停止该过程。我可以用 TerminateProcess
杀死它,但我想让它更优雅,因为该过程可能必须将数据保存到某个数据库或执行一些清理(例如关闭硬件连接)。
我试图通过 EnumWindows
和 GetWindowThreadProcessId
获取进程 HWND
但没有成功。事实上,EnumWindows
并没有列出我创建的进程。有了那个 HWND
,我的想法是发送一条 WM_CLOSE
消息。
也许我不应该使用 CREATE_NEW_CONSOLE
标志?我尝试了以下启动信息:
STARTUPINFO startupInfo;
ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
但这并没有向我显示控制台 window(我需要)。我究竟做错了什么?我应该如何创建我的进程以及我以后如何优雅地停止它?
事实上,在我尝试优雅地终止我的控制台时,将 HWND
连接到控制台 window 还为时过早。在一次测试中,我天真地创建了进程,然后几乎直接杀死了它。如果我等待足够长的时间(即,如果我实际上与我创建的进程交互了一段时间),那么我可以获得控制台的句柄 window 并向它发送 WM_CLOSE
成功消息。
在我的应用程序的某个地方,我正在创建一个这样的进程:
STARTUPINFO startupInfo;
ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION processInfo;
ZeroMemory(&processInfo, sizeof(processInfo));
const auto created = CreateProcessW(
pathToExe,
cmdLine,
nullptr,
nullptr,
false,
CREATE_NEW_CONSOLE,
nullptr,
workingDir,
&startupInfo,
&processInfo);
我这里的exe是运行控制台应用
稍后,我想优雅地停止该过程。我可以用 TerminateProcess
杀死它,但我想让它更优雅,因为该过程可能必须将数据保存到某个数据库或执行一些清理(例如关闭硬件连接)。
我试图通过 EnumWindows
和 GetWindowThreadProcessId
获取进程 HWND
但没有成功。事实上,EnumWindows
并没有列出我创建的进程。有了那个 HWND
,我的想法是发送一条 WM_CLOSE
消息。
也许我不应该使用 CREATE_NEW_CONSOLE
标志?我尝试了以下启动信息:
STARTUPINFO startupInfo;
ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
但这并没有向我显示控制台 window(我需要)。我究竟做错了什么?我应该如何创建我的进程以及我以后如何优雅地停止它?
事实上,在我尝试优雅地终止我的控制台时,将 HWND
连接到控制台 window 还为时过早。在一次测试中,我天真地创建了进程,然后几乎直接杀死了它。如果我等待足够长的时间(即,如果我实际上与我创建的进程交互了一段时间),那么我可以获得控制台的句柄 window 并向它发送 WM_CLOSE
成功消息。