ParentalControlTimeLimits のサンプル
保護者の方は、お子様が Windows Vista マシンで過ごす時間を、Windows 保護者による制限 (WPC) の時間制限機能を使用して制限できます。時間制限のあるお子様は、制限時間の 15 分前および 1 分前にシステム トレイでアカウント ロックアウト通知を受け取り、制限時間になるとアカウントから即座にログアウトされます。その時点で動作中のプログラムはすべて、ロックアウトの期間中、継続して動作します。
ゲームの作成者は、ユーザーのアカウントで時間制限が有効になっている可能性があることに配慮し、必要に応じてユーザーにフィードバックを提供する必要があります。次に例を示します。
- 時間のかかる MMO クエストの開始を選択する前に、ロックアウトが差し迫っていることをユーザーに警告する。
- 15 分前および 1 分前にシステム トレイに表示されるアイコンによる通知は消えるので、全画面表示のゲームの場合、それに代わるものとして時間制限の通知をゲーム内で表示する。
このサンプルでは、現在のユーザーの WPC 時間制限情報を問い合わせる方法を示します。その情報を使用して、各曜日の制限時刻、および時間制限によってユーザーがログオフされるまでの残り時間を表示します。
Path
ソース : | (SDK ルート)\Samples\C++\Misc\ParentalControlTimeLimits |
実行可能ファイル : | (SDK ルート)\Samples\C++\Misc\Bin\x86 or x64\ParentalControlTimeLimits.exe |
現行ユーザーの時間制限情報の取得
サンプル ファイル TimeLimitAPI.h および TimeLimitAPI.cpp で定義される簡単な API では、必要な時間制限情報を Windows Management Instrumentation (WMI) サービスから取得するためのクリーンなインターフェイスを提供します。これらのファイルはユーザーのプロジェクトに簡単に統合できるので、ユーザーは該当する API を簡単に利用できます。ユーザーのプロジェクトは wbemuuid.lib および msxml2.lib にも依存しており、これらのライブラリは Windows SDK に含まれています。
TimeLimitAPI の関数 :
- TimeLimitEnabled() -- 現在のユーザーに時間制限が課せられているかどうかをチェックします。
- TimeLimitGetTimeRemaining() -- 残り時間 (日、時、分、および秒) を取得します。
- TimeLimitGetSecondsRemaining() -- 時間制限のために現在のユーザーがそのアカウントからロックアウトされるまでの残り時間 (秒) を取得します。
- TimeLimitGetHourlyRestrictions() -- 現在のユーザーの各曜日の制限時間を取得します。
このサンプルでは、ParentalControlTimeLimits.cpp の OnFrameRender() 内の TimeLimitAPI 関数を説明します。
if( TimeLimitEnabled() )
{
//
// Draw account lock out time
//
TimeRemaining remaining;
if( SUCCEEDED( TimeLimitGetTimeRemaining( &remaining ) ) )
{
V( miscTxt.DrawFormattedTextLine( drawRect,
DT_CENTER | DT_VCENTER,
L"Time until account lock-out: %dd %dh %dm %ds",
remaining.days,
remaining.hours,
remaining.minutes,
remaining.seconds ) );
}
//
// Fill in each grid cell that corresponds to a restriced hour
//
HourlyRestrictions restrictions;
if( SUCCEEDED( TimeLimitGetHourlyRestrictions( &restrictions ) ) )
{
for( int day = 0; day < DaysPerWeek; ++day )
{
for( int hour = 0; hour < HoursPerDay; ++hour )
{
unsigned int hourMask = 1 << hour;
if( !( restrictions.days[day] & hourMask ) )
{
// fill in the appropriate cell
RECT cell;
cell.left = g_gridPos.x + g_gridCellWidth * hour;
cell.right = cell.left + g_gridCellWidth;
cell.top = g_gridPos.y + g_gridCellWidth * day;
cell.bottom = cell.top + g_gridCellWidth;
V( pd3dDevice->ColorFill( pSurface, &cell, ClrGridCell ) );
}
}
}
}
}