2015-01-22 4 views
0

Я использую приложение ниже, когда когда-либо нажимаю кнопку включения питания cpu`, мое приложение для паузы в течение нескольких минут, как 5 минут для того, что я использовал ниже. Проблема заключается в том, что я б сна (300000) для останавливая несколько минут, но операция не выполняет всякий раз, когда я нажимаю кнопку питания, пожалуйста, дайте мне знать, если таковые имеются наТест на нажатие кнопки включения питания с помощью c

#include <windows.h> 
#include <stdio.h> 
#include <pthread.h> 
#include <signal.h> 
#include <sys/types.h> 
#include <unistd.h> 

#define SHUTDOWN_TEST 
FILE *fp; 

BOOL CtrlHandler(DWORD fdwCtrlType) 
{ 
    time_t rawtime; 
    struct tm * timeinfo; 

    time (&rawtime); 
    timeinfo = localtime (&rawtime); 

    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: 


     printf("Ctrl-Shutdown event\n\n"); 
     while(1) 
     {  
      Sleep(300000); 
     } 

     Beep(750, 500); 

     return FALSE; 

    default: 
     return FALSE; 
    } 
} 

int main(void) 
{ 
    fp = (fopen("C:\\shutdown.txt","w")); 

#ifdef SHUTDOWN_TEST 
    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){ 
      printf("I am running\n"); 
      Sleep(3000) ; 
     } 
    } 
    else 
    { 
     printf("\nERROR: Could not set control handler"); 
     return 1; 
    } 

    fclose(fp); 
#else 
    if (pid = fork()) 
    { 
     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){ 
       // printf("I am running\n"); 
       // Sleep(3000) ; 
      } 
     } 
    } 
    else 
    { 

    } 
#endif 
    return 0; 
} 
+0

Ваш вопрос необходимо отредактировать, поскольку, по-видимому, часть текста обрезана, поэтому непонятно, что вы просите. Пожалуйста, будьте как можно более конкретными, о том, какое поведение вы ожидаете, и какой результат вы действительно получаете при определении своей проблемы. Я также добавляю тэг 'winapi' к вашему сообщению - правильная маркировка увеличит ваши шансы получить лучший ответ. Я также удалил прокомментированный код в вашем сообщении, поскольку он не имеет отношения к делу. Пожалуйста, посетите раздел «Вопросы и ответы», раздел «Как спросить» и эту страницу http://stackoverflow.com/help/mcve. Добро пожаловать в SO. – frasnian

+0

вышеприведенное приложение во время работы, если я нажимаю ctrl-c и ctrl-break событие, которое я вижу в работе .exe, потому что это программные прерывания sigint и sigabrt, но когда я нажимаю кнопку питания CPU для CTRL_SHUTDOWN_EVENT, ее следует ждать несколько минут есть ли какие-либо окна api для приостановки, –

ответ

1

Блокировка выключения системы не может быть сделано внутри такого обработчика. С Windows Vista появился новый API.

Использование ShutdownBlockReasonCreate

Вы можете использовать GetConsoleWindow, чтобы получить требуемый дескриптор окна.

Прочитать link, чтобы увидеть изменения с Vista.

+0

Я использую Windows 7 64-разрядная машина есть ли возможность приостановить приложение в течение нескольких минут при выключении –

+0

Прочтите документы. Я дал вам. Я добавил ссылку. – xMRi

+0

, где вы добавили ссылку –

Смежные вопросы