どうも、久しぶりです。

 

今回はふとスクリーンセーバーってどうやって作るのだろうかと疑問に思ったのでWindowsAPIを用いて作成してみました。

 

作り方を調べてみるとどうやら

 

ScreenSaverConfigDialog()

 

ScreenSaverProc()

 

RegisterDialogClass()

 

の三つの関数を作成すれば作れるとのこと。

 

ScreenSaverConfigDialog関数とRegisterDialogClass関数は通常は真の値を返せば良いようです。

 

あとはScreenSaverProc関数内でメッセージに応じた処理を行えば良いとのこと。

 

ということで簡単にプログラムを書いてみました。

 

----------------------------------------------------------

#include <windows.h> 
#include <scrnsave.h>

#pragma comment(lib,\"ScrnSave.lib\")
#pragma comment(lib,\"Comctl32.lib\")

#define TIMER_ID 1

LRESULT WINAPI ScreenSaverProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {

	HDC hdc;

	switch (msg) {

	case WM_CREATE:

		SetTimer(hwnd, TIMER_ID, 60, NULL);

		break;

	case WM_TIMER:

		hdc = GetDC(hwnd);

		//ここに描画処理を書く

		ReleaseDC(hwnd, hdc);

		break;

	case WM_DESTROY:

		KillTimer(hwnd, TIMER_ID);

		PostQuitMessage(0);

		return 0;
	}

	return DefScreenSaverProc(hwnd, msg, wParam, lParam);
}

BOOL WINAPI ScreenSaverConfigureDialog(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) {

	return TRUE;
}

BOOL WINAPI RegisterDialogClasses(HANDLE hInstance) {

	return TRUE;
}

----------------------------------------------------------------

これを実行したら黒い画面が出てきてマウスを動かすと終了したので成功です。

 

またスクリーンセーバーを実行する際はファイルの拡張子をexeからscrへと変更して実行しましょう。