2013-05-18(Sat)

win32でエアロなウィンドウのサイズを取得

Win32:画面のスナップ画像をキャプチャしようとして、マルチモニタやエアロなウィンドウのサイズ取得を調べたのでメモ。

全画面のサイズ取得

■ モニタのサイズ取得
MONITORINFO mi;
mi.cbSize = sizeof(MONITORINFO);
HMONITOR hMon =  MonitorFromWindow( GetDesktopWindow(), MONITOR_DEFAULTTOPRIMARY );
GetMonitorInfo( hMon, &mi );
// mi.rcMonitor.Top ( Left, Right, Bottom )でモニタの座標が取れる
// mi.rcWork.Top ( Left, Right, Bottom )で作業エリア(タスクバーを抜いたサイズ)が取れる

ウィンドウのサイズ取得

■ エアロ未使用の場合
GetWindowRect( hWnd, &rc );	// 普通にGetWindowRect
■ エアロ使用の場合
dwmapi.dllのDwmGetWindowAttribute()を使用
// GetWindowRect()だと、サイズ固定ウィンドウで外周分が欠けてしまう
// 固定・可変ウィンドウ共にDwmGetWindowAttribute()で正しく取れた
DwmGetWindowAttribute( hWnd, DWMWA_EXTENDED_FRAME_BOUNDS, &rc, sizeof (Rect) )
// DWMWA_EXTENDED_FRAME_BOUNDS = 0x9

dwmapi.dllとエアロチェックとDwmGetWindowAttribute()

http://stackoverflow.com/questions/4602936/delay-in-drawing-on-windows-7-os を参考に、エアロのチェックとDwmGetWindowAttribute()が使えるようにDLLをロードする
typedef HRESULT (WINAPI *pfnDwmIsCompositionEnabled)(BOOL *pfEnabled);
typedef HRESULT (WINAPI *pfnDwmGetWindowAttribute)(HWND hwnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute);

// DLLロード:SysPathはGetSystemDirectory()等で取得することでセキュアに
HMODULE hDWM = LoadLibrary( "[SysPath]/dwmapi.dll" )

if( hDWM ){
	F_DwmIsCompositionEnabled = (pfnDwmIsCompositionEnabled)GetProcAddress( hDWM, "DwmIsCompositionEnabled" );
	F_DwmGetWindowAttribute = (pfnDwmGetWindowAttribute)GetProcAddress( hDWM, "DwmGetWindowAttribute");
}

// そもそもエアロに未対応の場合はDwmIsCompositionEnabledのロードが失敗するのでそれで判定
BOOL bAero = FALSE
if( F_DwmIsCompositionEnabled ){
	// エアロ対応環境だとしても有効になっているかをチェック
	F_DwmIsCompositionEnabled( &bAero )
}
プロフィール

nakami

Author:nakami
可愛いテンプレートに似合う俺
うそAチームのスミス大佐

NAVI
カテゴリー
最近の記事
リンク
FC2カウンター
ブログ内検索
RSSフィード
sponsored link