作成 2011.02.17
更新 2011.06.07
VC++ でスクリーンセーバーのサンプルコード
コード
Visual C++ 2010 Express で作成しました。
スクリーンセーバーが起動し、一定時間経過後、外部プログラムを実行するサンプルです。
このサンプルでは起動してから 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);
	}
}

作り方のメモ
プロジェクト作成~追加まで
  1. [ファイル]-[新規作成]-[プロジェクト]
  2. [Win32 プロジェクト]-"プロジェクトの名前を任意に指定"-[OK]
  3. 「Win32 アプリケーション ウィザードへようこそ」画面 [次へ]
  4. 「アプリケーションの設定」画面 [空のプロジェクト]-オン-[完了]
  5. [ソース ファイル]フォルダ 右クリック-[追加]-[新しい項目]
  6. [C++ ファイル]-"任意のファイル名を指定"-[追加]
  7. 上のコードをコピペ
    赤波線などが無ければOK
ランタイム ライブラリを不要にする設定
必須ではないけど、これがないと C++ で作った意味がないよね。
  1. Alt+F7 でプロジェクトのプロパティ ページが開く
  2. 画面左上「構成」[Release]に変更
  3. [構成プロパティ]-[C/C++]-[コード生成]-右ペイン [ランタイム ライブラリ]-[マルチスレッド(/MT)]-[OK]
    以降、Release でビルドすると、ランタイム ライブラリが不要なアプリケーションを生成できます。
ビルドと実行
F5 では実行できません。
  1. 画面上部 "Debug" を "Release" へ変更
  2. F7 でビルド
    プロジェクトの Release フォルダに "プロジェクト名.exe" ファイルが生成される
  3. "プロジェクト名.exe" の拡張子を "scr" へ変更し、右クリック-[Test]
修正項目
タグ: VCpp

©2004-2017 UPKEN IPv4