クライアント領域の表示状態を調べる <TOP>
クライアント領域の表示状態を調べます。
FindWindow クラス名、キャプション名を与えてウィンドウハンドルを取得
GetClipBox デバイスコンテキストの歌詞領域を描画できる最小境界長方形の寸法を取得
GetClientRect ウィンドウのクライアント領域座標を取得
EqualRect 二つの長方形の寸法を比較して、等しいかどうかを調べる
GetDC デバイスコンテキストを取得
ReleaseDC デバイスコンテキストの解放
前もってメモ帳を起動しておき、その領域の表示状態を調べています。
注)
Windows 7 において、Aeroテーマではどの状態でも「完全に見えている」となります。
Windows Vista では、試しておりませんが同様ではないかと・・
'================================================================ '= クライアント領域の表示状態を調べる '= (EqualRect.bas) '================================================================ #include "Windows.bi" Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type ' クラス名またはキャプションを与えてウィンドウのハンドルを取得 Declare Function Api_FindWindow& Lib "user32" Alias "FindWindowA" (ByVal lpClassName$, ByVal lpWindowName$) ' デバイスコンテキストの可視領域を描画できる最小境界長方形の寸法を取得 Declare Function Api_GetClipBox& Lib "gdi32" Alias "GetClipBox" (ByVal hDC&, lprc As RECT) ' ウィンドウのクライアント領域の座標を取得 Declare Function Api_GetClientRect& Lib "user32" Alias "GetClientRect" (ByVal hWnd&, lpRect As RECT) ' 2つの長方形の寸法を比較して、長方形が等しいかどうかを判断 Declare Function Api_EqualRect& Lib "user32" Alias "EqualRect" (lprc1 As RECT, lprc2 As RECT) ' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得 Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&) ' デバイスコンテキストを解放 Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&) #define ERROR 0 'エラー #define NULLREGION 1 '空のリージョンが作成された #define SIMPLEREGION 2 '境界の重ならないリージョンが作成された #define COMPLEXREGION 3 'ひとつ以上の長方形からなるリージョンが作成された Var Shared Text1 As Object Var Shared Button1 As Object Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14 Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14 '================================================================ '= '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() Var ClassName As String Var hWindow As Long Var hDC As Long Var ClientRect As RECT Var ClipBoxRect As RECT Var Ret As Long 'クラス名でウィンドウハンドルを取得 ClassName = "Notepad" hWindow = Api_FindWindow(ClassName, ByVal 0) 'ウィンドウハンドルが取得できた場合は If hWindow <> 0 Then 'クライアント領域に対応するデバイスコンテキストのハンドルを取得 hDC = Api_GetDC(hWindow) '可視領域を描画できる最小境界長方形の寸法を取得 Select Case Api_GetClipBox(hDC, ClipBoxRect) 'リージョンは空 Case NULLREGION Text1.SetWindowText "完全に隠れている" 'リージョンは単一の長方形 Case SIMPLEREGION 'ウィンドウのクライアント領域の寸法を取得 Ret = Api_GetClientRect(hWindow, ClientRect) '可視領域を描画できる最小境界長方形の寸法と比較 If Api_EqualRect(ClipBoxRect, ClientRect) Then Text1.SetWindowText "完全に見えている" Else Text1.SetWindowText "単一の長方形に見えるように隠れている" End If 'リージョンは複数の長方形 Case COMPLEXREGION Text1.SetWindowText "複数の長方形に見えるように隠れている" 'エラー Case ERROR Text1.SetWindowText "エラーで取得できない" End Select 'デバイスコンテキストを解放 Ret = Api_ReleaseDC(hWindow, hDC) Else A% = MessageBox("EqualRect", "メモ帳を起動してください!", 0, 2) End If End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End