« 2014年3月 | トップページ | 2014年8月 »

2014年4月

2014年4月21日 (月)

Aeroが有効の環境でのウィンドウサイズ取得

Windows Vista 以降でAeroを使用している環境ではGetWindowRect()が
サイズ固定のウィンドウに対し実際のウィンドウより小さい矩形を取得してくる。
どうも、Vista以降で導入されたフレーム拡張のためらしい。

以下のサイトに感謝
http://www.orangemaker.sakura.ne.jp/labo/memo/sdk-mfc/earoframeex.html
http://jnsmith.blog64.fc2.com/blog-entry-104.html

フレーム拡張を考慮したウィンドウサイズを取得するためには
DwmGetWindowAttribute()を使用する。
Vista以降でAeroを有効としていない環境を考慮するためには
DwmGetWindowAttribute()でAaroが有効か調べる。

1.
2.
3.
4.
5.
6.
7.
BOO bAero;   
DwmGetWindowAttribute(&bAero);   
if(bAero==TRUE){   
    RECT rc;   
    DwmGetWindowAttribute(hWnd,DWMWA_EXTENDED_FRAME_BOUNDS,&rc,sizeof(rc));   
}   
‌ 
このコードは CodePublisher で生成しています

DWM関数はVista以降で用意された関数群のため
XP以前を考慮するにはDWM関数のDLLであるdwmapi.dllが
LoadLibrary()できるかで判断できる。

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
typedef HRESULT (WINAPI *PDwmIsCompositionEnabled)(BOOL*);  
typedef HRESULT (WINAPI *PDwmGetWindowAttribute)(HWND,DWORD,LPCVOID,DWORD);  
‌   
PDwmIsCompositionEnabled fpDwmIsCompositionEnabled;  
PDwmGetWindowAttribute   fpDwmGetWindowAttribute;  
‌   
TCHAR dir[MAX_PATH];  
HMODULE  hDWM;  
GetSystemDirectory(dir,sizeof(dir));  
lstrcat(dir,_T("\\dwmapi.dll"));  
hDWM=LoadLibrary(dir);  
if(hDWM!=NULL){  
    fpDwmIsCompositionEnabled=(PDwmIsCompositionEnabled)GetProcAddress(hDWM,"DwmIsCompositionEnabled");  
    fpDwmGetWindowAttribute=(PDwmGetWindowAttribute)GetProcAddress(hDWM,"DwmGetWindowAttribute");  
}  
‌  
‌ 
このコードは CodePublisher で生成しています

なお、これらDWM関数の戻り値はHRESULT型なので
関数が成功しているか調べるためにはSUCCEEDED()マクロを使用する。

| | コメント (1) | トラックバック (0)

2014年4月 3日 (木)

窓掴み 0.41 公開

窓掴み 0.41を公開しました。

スナップする対象にデスクトップの枠を追加など
スナップ機能の改善をしました。


ダンロードページ

| | コメント (2) | トラックバック (0)

« 2014年3月 | トップページ | 2014年8月 »