Programming Windows Maniacs - プログラミング ウィンドウズ マニアックス ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて  
ホーム >> システム >> 現在スクリーンセーバーが開始される設定か、開始されないか設定か取得するには

現在スクリーンセーバーが開始される設定か、開始されないか設定か取得するには

  現在スクリーンセーバーが開始される設定か、開始されないか設定か取得するには、SystemParametersInfo () APISPI_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;
}
  ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて Copyright © 2014 A.Morita