#include #include #include bool ShutDown() { HANDLE hTokenHandle; // プロセスのトークンを取得する if( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hTokenHandle ) ) { return 1; } // TOKEN_ADJUST_PRIVILEGESの情報を取得する DWORD cbReturned = 0; BYTE bBuffer[1024]; TOKEN_PRIVILEGES* pToken; GetTokenInformation( hTokenHandle, TokenPrivileges, bBuffer, (DWORD)sizeof(bBuffer), &cbReturned ); pToken = (TOKEN_PRIVILEGES*)bBuffer; LUID luid; LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &luid ); BYTE Buffer2[1024]; TOKEN_PRIVILEGES* pattr = (TOKEN_PRIVILEGES*)Buffer2; pattr->PrivilegeCount = 1; memcpy( &pattr->Privileges[0].Luid, &luid, sizeof(LUID) ); pattr->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // 属性の変更 BOOL bSuccess = AdjustTokenPrivileges( hTokenHandle, FALSE, pattr, sizeof(pattr->PrivilegeCount) + sizeof(pattr->Privileges[0]), NULL, 0 ); if( !bSuccess ) { MessageBox( NULL, "失敗", "", MB_OK ); return false; } ExitWindowsEx( EWX_POWEROFF, 0 ); // リブートする場合は、EWX_REBOOT //ExitWindowsEx( EWX_REBOOT, 0 ); return true; } void main() { COORD Pos; // コンソールのカーソル位置 HANDLE hOut; // ハンドル // 出力先のハンドルを取得 hOut = GetStdHandle( STD_OUTPUT_HANDLE ); // ローカルの時間を取得しておく time_t NowTime = time(NULL); struct tm* NowLocalTime = localtime(&NowTime); int Sec = 0; // ローカルの時間をシャットダウンの時間を合わせる int ShutDownHour = NowLocalTime->tm_hour; int ShutDownMin = NowLocalTime->tm_min; int ShutDownSec = NowLocalTime->tm_sec; // シャットダウンの時間をローカルじかんより20秒だけ増やす if( 40 < ShutDownSec ) { ShutDownMin++; ShutDownSec = ( 20 + ShutDownSec ) % 60; } else { ShutDownSec += 20; } // 時間と分をすべて秒に換算して、合計しておく int ShutDownSumSec = ShutDownHour * 60 * 60 + ShutDownMin * 60 + ShutDownSec; // 残り時間の初期化 int RemainderSumSec = 0; //int RemainderHour = 0; //int RemainderMin = 0; //int RemainderSec = 0; // ここからループ処理 while( 1 ) { // ローカルの時間を再取得 NowTime = time(NULL); NowLocalTime = localtime(&NowTime); // 秒が増えたら、表示を更新する if( Sec != NowLocalTime->tm_sec ) { Sec = NowLocalTime->tm_sec; printf("%d年%d月%d日%2d時%2d分%2d秒\n", (NowLocalTime->tm_year) + 1900, (NowLocalTime->tm_mon) + 1, NowLocalTime->tm_mday, NowLocalTime->tm_hour, NowLocalTime->tm_min, NowLocalTime->tm_sec ); // SumSecは1ずつ増えていく int SumSec = NowLocalTime->tm_hour * 60 * 60 + NowLocalTime->tm_min * 60 + NowLocalTime->tm_sec; // 残り時間の計算 if( SumSec <= ShutDownSumSec ) { RemainderSumSec = ShutDownSumSec - SumSec; } else { RemainderSumSec = 12 * 60 * 60 + ShutDownSumSec - SumSec; } printf("%2d\nシャットダウンまであと%d時間%d分%d秒\n", RemainderSumSec, RemainderSumSec / ( 60 * 60 ), ( RemainderSumSec / 60 ) % 60, RemainderSumSec % 60 ); // 残り時間がゼロのときの処理 if( RemainderSumSec == 0 ) { //printf("20秒が経過しました。\n"); // 特定の処理をここに書く。 ShutDown(); break; } // カーソルを通常位置に戻す Pos.X = 0; Pos.Y = 0; SetConsoleCursorPosition( hOut, Pos ); } } getchar(); }