我必须捕捉控制台事件closuresbutton上的点击 ,这与ctrl-break事件SIGBREAK
相对应,但显然有一种超时,它不允许我做超过5秒的任何事情,在程序似乎中止之后所以消息“正确结束!”将永远不会发生)。
如何强制系统执行closures操作直至结束(或将超时延长至60秒)?
注意:使用相同的方法,我可以使用fflush(stdout);
成功处理CTRL + C事件( SIGINT
fflush(stdout);
在doStuffs();
之前doStuffs();
注2:我的代码是基于这个答案: https : //stackoverflow.com/a/181594/1529139
#include <csignal> void foo(int sig) { signal(sig, foo); // (reset for next signal) // do stuffs which takes aboutly 15 seconds doStuffs(); cout << "Properly ended !"; } int main(DWORD argc, LPWSTR *argv) { signal(SIGBREAK, foo); myProgramLoop(); }
我相信超时是固定的,无法修改它,请参阅API参考 :
如果进程在特定超时期限(CTRL_CLOSE_EVENT为5秒,CTRL_LOGOFF_EVENT和CTRL_SHUTDOWN_EVENT为20秒)内没有响应,系统也会显示对话框。
进程可以使用SetProcessShutdownParameters函数来防止显示CTRL_LOGOFF_EVENT和CTRL_SHUTDOWN_EVENT对话框。 在这种情况下,当HandlerRoutine返回TRUE或超时时间结束时,系统才会终止进程。
怎么样的替代方法,只是禁用您的控制台窗口的关闭按钮:
GUITHREADINFO info = {0}; info.cbSize=sizeof(info); GetGUIThreadInfo(NULL, &info); HMENU hSysMenu = GetSystemMenu(info.hwndActive, FALSE); EnableMenuItem(hSysMenu, SC_CLOSE, MF_GRAYED);
现在,您可以安全地通过Ctrl-C或其他键盘输入来处理关闭。