OrangeMaker_logo
memo アイコン SDK-MFC 備忘録

Windows SDKやMFCに関するメモです。
(記載内容について正しいことを保証するものではありません。MSDN等で確認してください)

エアロ判定

2009/10/1 作成
2009/10/11追記
2009/10/21追記

 VISTA以降では、エアロ状態で動作しているのか判定したいことがあります。APIで取得できればいいのですが、探した限りではないようなのでレジストリから取得しています。なのでこれが正解かどうかはわからないですが以下のようにやれば情報が取得できます。

例)

BOOL isAero()
{
    LONG lResult;
    HKEY hKeyResult;
    BOOL result = FALSE;
    lResult = RegOpenKeyEx(HKEY_CURRENT_USER,
        "Software\\Microsoft\\Windows\\DWM",0,KEY_ALL_ACCESS,&hKeyResult);
    if (lResult == ERROR_SUCCESS) {
        DWORD dwType = REG_DWORD;
        DWORD data = 0;
        DWORD dwData = sizeof(data);
        if(ERROR_SUCCESS == RegQueryValueEx(hKeyResult, 
            "Composition", NULL, &dwType,(LPBYTE)&data, &dwData)){
            if(data == 1){
                result = TRUE;
            }
        }
        RegCloseKey(hKeyResult);
    }
    return result;
}
		

追記(2009/10/11):
エアロの状態はDWM系の関数及びWM_DWMCOMPOSITIONCHANGED等のメッセージ通知で知ることができます。詳細はMSDN等でご確認ください)
ご参考URL:
http://msdn.microsoft.com/en-us/library/aa969540(VS.85).aspx

追記(2009/10/21)
エアロの状態をAPIで判別する方法についても具体的に記載しておきます。
エアロ状態はDWM(デスクトップウインドウマネージャ)の

HRESULT DwmIsCompositionEnabled( BOOL *pfEnabled);

で取得できます。

EX)
 BOOL enable = FALSE;
 HRESUST hr = DwmIsCompositionEnabled(&enable);
 if(SUCCEEDED(hr)){
     if(enable == TRUE){
         //Aero 有効の処理
     }
     else{
         //Aero 無効の処理
     }
 }
 else{
     //エラー
     //通常ここにはこない
 }
		

エアロの合成機能がON/OFFで処理を振り分けるだけならこの関数で簡単に判別できますが、DWM関係のAPIはエアロ機能がOFF->ONのタイミングで再設定する必要があるものがあります。(EX)このタイミングを知るには上記のWM_DWMCOMPOSITIONCHANGEDメッセージで状態の変化を知る必要があります。

EX)メッセージ処理
	
    (略)
 switch(message){
 case WM_DWMCOMPOSITIONCHANGED:
     //このメッセージは変化を通知するだけなのでON/OFFを知るには上記
     //DwmIsCompositionEnabled()で状態を取得します。
 }