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);
}
}