作成 2011.06.07
更新 2011.06.09
VC++ でスクリーンセーバーのサンプルコード2
コード
VC++ でスクリーンセーバーのサンプルコード の続きです。
  • レジストリ値を参照して、ある程度動的に変更できるようにした
  • フォントを変更できるようにした。MFC のクラスを使用していないので参照を増やす必要なし
#include <Windows.h>
#include <ScrnSave.h>

#pragma comment(lib,"scrnsavw.lib")
#pragma comment(lib,"comctl32.lib")

#define TIMER_ID 100001
#define STRING_BUFFER 8192
void count_down(HWND);
void get_registory(HWND);

int count = 60;
HFONT write_font = NULL;
COLORREF back_color = RGB(0,0,0);
COLORREF text_color = RGB(255,255,255);
LPWSTR user_name = new wchar_t[STRING_BUFFER];

LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch(msg)
	{
		case WM_CREATE:		// 起動処理
			get_registory(hWnd);
			// 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 get_registory(HWND hWnd)	// レジストリから値を取得する
{
	DWORD user_length = STRING_BUFFER;
	GetUserName(user_name, &user_length);
	HDC hdc;			// フォントを設定するために必要
	hdc = GetDC(hWnd);
	// 以下のレジストリ値を取得する								型			デフォルト値
	// HKEY_LOCAL_MACHINE/SOFTWARE/MyOriginalSubKey/CountTimer	REG_DWORD	300
	// HKEY_LOCAL_MACHINE/SOFTWARE/MyOriginalSubKey/BackColor_R	REG_DWORD	0
	// HKEY_LOCAL_MACHINE/SOFTWARE/MyOriginalSubKey/BackColor_G	REG_DWORD	0
	// HKEY_LOCAL_MACHINE/SOFTWARE/MyOriginalSubKey/BackColor_B	REG_DWORD	0
	// HKEY_LOCAL_MACHINE/SOFTWARE/MyOriginalSubKey/TextColor_R	REG_DWORD	255
	// HKEY_LOCAL_MACHINE/SOFTWARE/MyOriginalSubKey/TextColor_G	REG_DWORD	255
	// HKEY_LOCAL_MACHINE/SOFTWARE/MyOriginalSubKey/TextColor_B	REG_DWORD	255
	// HKEY_LOCAL_MACHINE/SOFTWARE/MyOriginalSubKey/FontName	REG_SZ		"MS ゴシック"
	// HKEY_LOCAL_MACHINE/SOFTWARE/MyOriginalSubKey/FontSize	REG_DWORD	16

	// デフォルト フォントの設定
	int font_size = 40;
	LPWSTR font_name = TEXT("MS ゴシック");
	write_font = CreateFont(-MulDiv(font_size, GetDeviceCaps(hdc, LOGPIXELSY), 72),
		0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
		CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, font_name);

	HKEY hkResult;		// キーのハンドル
	DWORD dwDisposition;	// 処理結果を受け取る
	LONG lResult;		// 関数の戻り値を格納する
	lResult = ::RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\MyOriginalSubKey"), 0, NULL,
		REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkResult, &dwDisposition);
	if( lResult != ERROR_SUCCESS )
	{
		// レジストリ キーが無ければデフォルト
		return;
	}

	DWORD lpType;
	DWORD lpSize;
	DWORD dword_value;
	DWORD color_r;
	DWORD color_g;
	DWORD color_b;
	LPWSTR sz_value = NULL;

	// データ型が正しいか確認、並びにデータサイズを事前取得
	lResult = RegQueryValueEx(hkResult, TEXT("CountTimer"), NULL, &lpType, NULL, &lpSize);
	if( lResult == ERROR_SUCCESS && lpType == REG_DWORD )
	{
		lResult = RegQueryValueEx(hkResult, TEXT("CountTimer"), NULL, NULL, (LPBYTE)&dword_value, &lpSize);
		if( lResult == ERROR_SUCCESS )
		{
			count = dword_value;
		}
	}
	// 以降同様
	color_r = 0;
	color_g = 0;
	color_b = 0;
	lResult = RegQueryValueEx(hkResult, TEXT("BackColor_R"), NULL, &lpType, NULL, &lpSize);
	if( lResult == ERROR_SUCCESS && lpType == REG_DWORD )
	{
		lResult = RegQueryValueEx(hkResult, TEXT("BackColor_R"), NULL, NULL, (LPBYTE)&dword_value, &lpSize);
		if( lResult == ERROR_SUCCESS )
		{
			color_r = dword_value;
		}
	}
	lResult = RegQueryValueEx(hkResult, TEXT("BackColor_G"), NULL, &lpType, NULL, &lpSize);
	if( lResult == ERROR_SUCCESS && lpType == REG_DWORD )
	{
		lResult = RegQueryValueEx(hkResult, TEXT("BackColor_G"), NULL, NULL, (LPBYTE)&dword_value, &lpSize);
		if( lResult == ERROR_SUCCESS )
		{
			color_g = dword_value;
		}
	}
	lResult = RegQueryValueEx(hkResult, TEXT("BackColor_B"), NULL, &lpType, NULL, &lpSize);
	if( lResult == ERROR_SUCCESS && lpType == REG_DWORD )
	{
		lResult = RegQueryValueEx(hkResult, TEXT("BackColor_B"), NULL, NULL, (LPBYTE)&dword_value, &lpSize);
		if( lResult == ERROR_SUCCESS )
		{
			color_b = dword_value;
		}
	}
	back_color = RGB(color_r,color_g,color_b);
	color_r = 255;
	color_g = 255;
	color_b = 255;
	lResult = RegQueryValueEx(hkResult, TEXT("TextColor_R"), NULL, &lpType, NULL, &lpSize);
	if( lResult == ERROR_SUCCESS && lpType == REG_SZ )
	{
		lResult = RegQueryValueEx(hkResult, TEXT("TextColor_R"), NULL, NULL, (LPBYTE)&dword_value, &lpSize);
		if( lResult == ERROR_SUCCESS )
		{
			color_r = dword_value;
		}
	}
	lResult = RegQueryValueEx(hkResult, TEXT("TextColor_G"), NULL, &lpType, NULL, &lpSize);
	if( lResult == ERROR_SUCCESS && lpType == REG_SZ )
	{
		lResult = RegQueryValueEx(hkResult, TEXT("TextColor_G"), NULL, NULL, (LPBYTE)&dword_value, &lpSize);
		if( lResult == ERROR_SUCCESS )
		{
			color_g = dword_value;
		}
	}
	lResult = RegQueryValueEx(hkResult, TEXT("TextColor_B"), NULL, &lpType, NULL, &lpSize);
	if( lResult == ERROR_SUCCESS && lpType == REG_SZ )
	{
		lResult = RegQueryValueEx(hkResult, TEXT("TextColor_B"), NULL, NULL, (LPBYTE)&dword_value, &lpSize);
		if( lResult == ERROR_SUCCESS )
		{
			color_b = dword_value;
		}
	}
	text_color = RGB(color_r,color_g,color_b);
	lResult = RegQueryValueEx(hkResult, TEXT("FontName"), NULL, &lpType, NULL, &lpSize);
	if( lResult == ERROR_SUCCESS && lpType == REG_SZ )
	{
		lResult = RegQueryValueEx(hkResult, TEXT("FontName"), NULL, NULL, (LPBYTE)sz_value, &lpSize);
		if( lResult == ERROR_SUCCESS )
		{
			font_name = sz_value;
		}
	}
	lResult = RegQueryValueEx(hkResult, TEXT("FontSize"), NULL, &lpType, NULL, &lpSize);
	if( lResult == ERROR_SUCCESS && lpType == REG_DWORD )
	{
		lResult = RegQueryValueEx(hkResult, TEXT("FontSize"), NULL, NULL, (LPBYTE)&dword_value, &lpSize);
		if( lResult == ERROR_SUCCESS )
		{
			font_size = dword_value;
		}
	}
	RegCloseKey(hkResult);

	// カスタマイズ フォントの設定
	write_font = CreateFont(-MulDiv(font_size, GetDeviceCaps(hdc, LOGPIXELSY), 72),
		0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
		CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, font_name);

	return;
}

void count_down(HWND hWnd)
{
	HDC hdc;
	hdc = GetDC(hWnd);
	LPWSTR str_disp = new wchar_t[STRING_BUFFER];
	
	wsprintf(str_disp, TEXT("一定時間操作されていないため\n%d 秒後にシャットダウンを行います。   \nマウス、キーボード操作により解除できます。\n%s"), count--, user_name);
	SetTextColor( hdc, text_color );
	SetBkColor( hdc, back_color );
	SelectObject( hdc, write_font );
	RECT rect;
	rect.top = 0;
	rect.left = 0;
	rect.right = 1280;
	rect.bottom = 800;
	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);
	}
}
タグ: VCpp

©2004-2017 UPKEN IPv4