【发布时间】:2015-01-04 11:26:11
【问题描述】:
我编写了一个在控制台中运行的应用程序,需要在系统关闭或用户注销之前进行快速备份。
我的测试应用程序使用信号写入一个文件,并在手动关闭控制台窗口时工作(单击 X)。但是当控制台在关机或注销时关闭时它不起作用。根据我在 MSDN 上阅读的内容,这应该可行。
程序是用cygwin64编译的,会不会是这个问题?
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
BOOL WINAPI myHandler(DWORD signal) {
switch(signal) {
case CTRL_C_EVENT:
printf("ctrl-c\n");
break;
case CTRL_BREAK_EVENT:
printf("break\n");
break;
default:
printf("Some other event\n");
}
FILE *file = fopen("windows_sig.txt", "w");
fprintf(file, "got signal: %d\n", signal);
fclose(file);
return TRUE;
}
int main(int argc, char *argv[])
{
if (!SetConsoleCtrlHandler((PHANDLER_ROUTINE)myHandler,TRUE)) {
fprintf(stderr, "Unable to install handler!\n");
return EXIT_FAILURE;
}
for (;;)
; //do nothing
return EXIT_SUCCESS;
}
【问题讨论】:
-
msdn 源,见 CTRL_SHUTDOWN_EVENT:msdn.microsoft.com/en-us/library/windows/desktop/…
-
此评论对实际解决您的问题没有多大帮助,但您是否看到 MSDN 文档中关于
CTRL_SHUTDOWN_EVENT的评论:“系统发送此信号时,交互应用程序不存在,因此只能在这种情况下接收服务" -
您可以打开一个隐藏窗口并使用它的消息循环来查找
WM_ENDSESSION和WM_QUERYENDSESSION消息。 msdn.microsoft.com/en-us/library/windows/desktop/aa376884.aspx -
嗯,它是一个打算在后台运行的守护进程。