現在スクリーンセーバーが開始される設定か、開始されないか設定か取得するには
現在スクリーンセーバーが開始される設定か、開始されないか設定か取得するには、SystemParametersInfo () APIで SPI_GETSCREENSAVEACTIVE を指定することにより取得できそうですが、行儀のよくない他のプログラムから操作されているときは、正しい値を取得できません。
正しい値を取得するには、下記レジストリを直接参照する必要があります。
ルートキー: HKEY_CURRENT_USER
サブキー: Control Panel\\Desktop
値の名前: ScreenSaveActive
値の種類: REG_SZ
ScreenSaveActiveが存在しないときや、ScreenSaveActiveが 0 のときは、スクリーンセーバーが開始されない設定です。
ScreenSaveActiveが 1 のときは、スクリーンセーバーが開始される設定です。
サンプルは下記になります。
■■■ scrnsvrop2 プロジェクト
■ main.cpp
#include <windows.h>
#include <tchar.h>
// レジストリの文字列の長さを取得する
BOOL RegGetStringLength ( HKEY hRootKey,
const _TCHAR *pszSubKey,
const _TCHAR *pszValueName,
DWORD &rdwValueSize )
{
HKEY hKey;
DWORD dwCreateKey;
BOOL bSuccess = FALSE;
if ( RegCreateKeyEx ( hRootKey,
pszSubKey,
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hKey,
&dwCreateKey ) == ERROR_SUCCESS )
{
DWORD dwType = REG_SZ;
DWORD dwLength;
if ( RegQueryValueEx ( hKey,
pszValueName,
NULL,
&dwType,
NULL,
&dwLength ) == ERROR_SUCCESS )
{
rdwValueSize = dwLength;
bSuccess = TRUE;
}
RegCloseKey ( hKey );
}
return bSuccess;
}
// レジストリの文字列を取得する
BOOL RegGetString ( HKEY hRootKey,
const _TCHAR *pszSubKey,
const _TCHAR *pszValueName,
_TCHAR *pszValue,
DWORD dwValueSize )
{
HKEY hKey;
DWORD dwCreateKey;
BOOL bSuccess = FALSE;
if ( RegCreateKeyEx ( hRootKey,
pszSubKey,
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hKey,
&dwCreateKey ) == ERROR_SUCCESS )
{
DWORD dwType = REG_SZ;
DWORD dwLength = dwValueSize;
if ( RegQueryValueEx ( hKey,
pszValueName,
NULL,
&dwType,
( BYTE * ) pszValue,
&dwLength ) == ERROR_SUCCESS )
{
bSuccess = TRUE;
}
RegCloseKey ( hKey );
}
return bSuccess;
}
// スクリーンセーバーのアクティブ状態を判定する(OSによるバグなし)
BOOL IsActive ()
{
BOOL bActive;
DWORD dwSize;
// スクリーンセーバーの サブキー
const _TCHAR cszRegSubKey[] = _TEXT ( "Control Panel\\Desktop" );
// スクリーンセーバーを起動するかどうかの 値の名前
const _TCHAR cszRegValueName[] = _TEXT ( "ScreenSaveActive" );
if ( RegGetStringLength ( HKEY_CURRENT_USER,
cszRegSubKey,
cszRegValueName,
dwSize ) )
{
_TCHAR *pszValue = new _TCHAR[ dwSize / sizeof ( _TCHAR ) ];
if ( RegGetString ( HKEY_CURRENT_USER,
cszRegSubKey,
cszRegValueName,
pszValue,
dwSize ) )
{
if ( lstrcmp ( pszValue, _TEXT ( "0" ) ) == 0 )
{
bActive = FALSE;
}
else if ( lstrcmp ( pszValue, _TEXT ( "1" ) ) == 0 )
{
bActive = TRUE;
}
else
{
bActive = FALSE;
}
}
// 取得できないときもOFF
else
{
bActive = FALSE;
}
delete [] pszValue;
}
// 取得できないときもOFF
else
{
bActive = FALSE;
}
return bActive;
}
// エントリポイント
int WINAPI _tWinMain ( HINSTANCE,
HINSTANCE,
_TCHAR *,
int )
{
if ( IsActive () )
{
MessageBox ( NULL,
_TEXT ( "現在スクリーンセーバーが開始される状態です。" ),
_TEXT ( "確認" ),
MB_OK );
}
else
{
MessageBox ( NULL,
_TEXT ( "現在スクリーンセーバーが開始されない状態です。" ),
_TEXT ( "確認" ),
MB_OK );
}
return 0;
}
|
|