如何优雅地停止使用 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 杀死它,但我想让它更优雅,因为该过程可能必须将数据保存到某个数据库或执行一些清理(例如关闭硬件连接)。

我试图通过 EnumWindowsGetWindowThreadProcessId 获取进程 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 成功消息。