C++,如何使控制台应用程序在关闭后在后台工作?
Posted
技术标签:
【中文标题】C++,如何使控制台应用程序在关闭后在后台工作?【英文标题】:C++, how to make the console application work in the background after it is closed? 【发布时间】:2020-09-26 21:25:27 【问题描述】:有没有办法做到这一点?我的意思是,关闭控制台应用程序而不是进程,该应用程序仍然在后台运行。 我在 Windows 上
【问题讨论】:
这是否是一个控制台应用程序的原因?制作后台应用程序的正常方法是一开始就没有控制台。 当您的应用程序启动时,它需要生成一个非控制台后台服务器来完成所有与用户界面无关的工作。当控制台关闭时,前台控制台 UI 进程无法避免终止。打电话给FreeConsole
为时已晚。一旦应用程序收到控制台CTRL_CLOSE_EVENT
,它有 5 秒的时间自行优雅退出,之后 Windows 会话服务器 (csrss.exe) 将强制终止它。
【参考方案1】:
有很多方法可以做到这一点:
-
您可以通过执行类似
ShowWindow(GetConsoleWindow(), SW_HIDE);
或FreeConsole(void);
的操作来隐藏控制台
使用int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);
并将最后一个参数设置为false(如果您使用的是windows)
但要避免关闭窗口并让它仍然运行,我不完全确定。最好的方法是有一些命令来隐藏窗口。
【讨论】:
仅当GetWindowThreadProcessId
认为您的进程是窗口的有效所有者时才隐藏控制台窗口。对于普通的控制台窗口,conhost.exe 是窗口的真正所有者,但系统会跟踪有效的所有者。通常是客户端进程分配了控制台会话。请注意,对于 Windows 10 中的 ConPTY 会话,例如在 Windows 终端下,conhost.exe(或 openconsole.exe)拥有由 GetConsoleWindow
返回的窗口,这只是一个隐藏窗口,存在以满足 API 要求。跨度>
以上是关于C++,如何使控制台应用程序在关闭后在后台工作?的主要内容,如果未能解决你的问题,请参考以下文章
iOS在一分钟内杀死CallKit VoIP应用程序在后台工作
Worklight iOS Geofence Native API 在几分钟后停止在后台工作