スクリーンセーバーが起動し、一定時間経過後、外部プログラムを実行するサンプルです。
このサンプルでは起動してから 300 秒後にシャットダウンします。
なお、32bit版です。/MACHINE:X64 ではコンパイルが通りません。
動的にパラメーターを変更したい場合はレジストリをロードするように改変するなりしてください。
#include <Windows.h> #include <ScrnSave.h> #pragma comment(lib,"scrnsavw.lib") #pragma comment(lib,"comctl32.lib") #define TIMER_ID 100001 #define STRING_BUFFER 1000 void count_down(HWND); int count = 300; LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CREATE: // 起動処理 // 1秒間隔で実行 SetTimer(hWnd , TIMER_ID , 1000 , NULL); break; case WM_DESTROY: // 終了処理 break; case WM_ERASEBKGND: // 真を返すとWindwosによる背景消去が行われない。 break; case WM_TIMER: // タイマ通知 // 描画処理 count_down(hWnd); break; case WM_SIZE: // サイズ変更通知 break; default: break; } return DefScreenSaverProc(hWnd, msg, wParam, lParam); } BOOL WINAPI ScreenSaverConfigureDialog(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { return TRUE; } BOOL WINAPI RegisterDialogClasses(HANDLE hInst) { return TRUE; } void count_down(HWND hWnd) { HDC hdc; hdc = GetDC(hWnd); LPWSTR str_disp = new wchar_t[STRING_BUFFER]; LPCWSTR blank_space = TEXT(" "); wsprintf(str_disp, TEXT("あと %d 秒でシャットダウンします。"), count--); SetTextColor( hdc, RGB( 255, 255, 255 ) ); SetBkColor( hdc, RGB( 0, 0, 0 ) ); RECT rect; rect.top = 30; rect.left = 30; rect.right = 300; rect.bottom = 100; DrawText( hdc, blank_space, lstrlen(blank_space), &rect, DT_WORDBREAK ); DrawText( hdc, str_disp, lstrlen(str_disp), &rect, DT_WORDBREAK); ReleaseDC(hWnd, hdc); if(count <= 0) { KillTimer(hWnd, TIMER_ID); ShellExecute(hWnd, NULL, TEXT("C:\\Windows\\system32\\shutdown.exe"), TEXT("/s /t 0 /f /c \"Screen Saver Shutdown.\" /d p:0:0"), TEXT(".\\"),SW_HIDE); } }