2012-05-21 128 views
0

我正在用C++寫一個控制檯應用程序。如何處理控制檯應用程序中的shutdown logoff?

我使用SetConsoleCtrlHandler來關閉任何應用程序(CTRL + C,關閉控制檯,Windows關機或註銷)。

#include <windows.h> 
#include <stdio.h> 

BOOL CtrlHandler(DWORD fdwCtrlType) 
{ 
    switch(fdwCtrlType) 
    { 
    // Handle the CTRL-C signal. 
    case CTRL_C_EVENT: 
     printf("Ctrl-C event\n\n"); 
     Beep(750, 300); 
     return(TRUE); 

    // CTRL-CLOSE: confirm that the user wants to exit. 
    case CTRL_CLOSE_EVENT: 
     Beep(600, 200); 
     printf("Ctrl-Close event\n\n"); 
     return(TRUE); 

    // Pass other signals to the next handler. 
    case CTRL_BREAK_EVENT: 
     Beep(900, 200); 
     printf("Ctrl-Break event\n\n"); 
     return FALSE; 

    case CTRL_LOGOFF_EVENT: 
     Beep(1000, 200); 
     printf("Ctrl-Logoff event\n\n"); 
     return FALSE; 

    case CTRL_SHUTDOWN_EVENT: 
     Beep(750, 500); 
     printf("Ctrl-Shutdown event\n\n"); 
     return FALSE; 

    default: 
     return FALSE; 
    } 
} 

int main(void) 
{  
    //MessageBoxA(0, "test", "test", 0); // **************** 

    if(SetConsoleCtrlHandler((PHANDLER_ROUTINE) CtrlHandler, TRUE)) 
    { 
    printf("\nThe Control Handler is installed.\n"); 
    printf("\n -- Now try pressing Ctrl+C or Ctrl+Break, or"); 
    printf("\n try logging off or closing the console...\n"); 
    printf("\n(...waiting in a loop for events...)\n\n"); 

    while(1){ } 
    } 
    else 
    { 
    printf("\nERROR: Could not set control handler"); 
    return 1; 
    } 
    return 0; 
} 

這是msdn的例子,它工作正常,直到我取消註釋標記行。當我這樣做時,我的應用程序處理CTRL + C,CTRL + Break和控制檯關閉,但在關閉或註銷時,它只是關閉而沒有任何反應。

Windows 7中,10 MSVC Express Edition的

回答

1

只要你表現出從一個控制檯應用程序對話框,在該線程創建的消息循環。

而且一旦你有一個消息循環,你必須處理WM_ENDSESSIONrelated消息。

+0

這不僅發生後MessageBoxA,但也OemToCharBuffA或升壓:: ASIO – enji

+0

幾個電話我除了線程創建不可見的窗口和處理WM_ENDSESSION它messageproc – enji

+0

這是否解決了問題嗎? – rogerdpack

相關問題