スクリーンセーバーが起動し、一定時間経過後、外部プログラムを実行するサンプルです。
このサンプルでは起動してから 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);
}
}