〜 ウィンドウ 〜
ウィンドウの外枠サイズ・タイトルバーの高さを取得2 (要USER32.DLL)

WindowsAPIを利用して、ウィンドウの枠幅やタイトルバーの高さを取得する方法を紹介します。
このような画面構成やシステム設定情報を取得するにはAPI関数GetSystemMetricsで、
取得情報パラメータnIndexに以下の値を指定します。
SM_CXDLGFRAME, SM_CXFIXEDFRAME
SM_CYDLGFRAME, SM_CYFIXEDFRAME
0x0007
0x0008
ID0のようなサイズ固定ウィンドウの枠サイズ
SM_CXFRAME, SM_CXSIZEFRAME
SM_CYFRAME, SM_CYSIZEFRAME
0x0020
0x0021
ID0以外のようなサイズ可変ウィンドウの枠サイズ
SM_CYCAPTION0x0004タイトルバーの高さ
SM_CYSMCAPTION0x0033小さなタイトルバーの高さ
このようにサイズ可変と不変ウィンドウでは取得に必要な指定パラメータが異なるため、 現在アクティブなウィンドウはサイズが可変なのか不変なのかを確認したうえで指定しなければなりません。 デフォルトではID0だけが不変で、それ以外は可変ウィンドウですが、 ID0以外もサイズ不変なウィンドウに設定可能なので、ウィンドウIDによる切り分けは使えません。 そこで、他Tipsでも何度か紹介しているウィンドウスタイル取得APIGetWindowLongを使います。 取得するのは、標準ウィンドウスタイル「GWL_STYLE(-16)」のうち、 サイズ境界線を持つウィンドウ「WS_THICKFRAME(0x00040000)」か「WS_SIZEBOX(0x00040000)」です。 スタイル情報を取得すると、境界線の有無以外の最大化ボタンやスクロールバーの有無も同時に返るので、 「可変結果 = スタイル & 0x40000」として、0なら不変、0以外でサイズ可変ウィンドウとして処理します。
尚、ココでは説明しませんがGetSystemMetricsの取得情報パラメータに以下の値を指定することも可能です。
SM_CLEANBOOT0x0043システムブート。0:通常、1:セーフモード、2:ネットワークセーフモード
SM_SLOWMACHINE0x0049コンピュータのプロセッサが遅いか否か
SM_SECURE0x002Cセキュリティが存在するか否か
SM_NETWORK0x003Fネットワークが存在するか否か
SM_MIDEASTENABLED0x004Aヘブライ語やアラビア語が利用可能なシステムか否か
SM_IMMENABLED0x0052IMEが有効になっているか否か
SM_CMOUSEBUTTONS0x002Bマウスボタンの数
SM_MOUSEPRESENT0x0013マウスが接続されているか否か
SM_MOUSEWHEELPRESENT0x004Bホイール付きマウスが接続されているか否か
SM_SWAPBUTTON0x0017左右のマウスボタンの機能を交換しているか否か
SM_CXCURSOR
SM_CYCURSOR
0x000D
0x000E
マウスカーソルのサイズ
SM_XVIRTUALSCREEN
SM_YVIRTUALSCREEN
0x004C
0x004D
仮想画面の左上端座標
SM_CMONITORS0x0050モニターの数
SM_SAMEDISPLAYFORMAT0x0051複数のモニタが存在するか否か
SM_CXVIRTUALSCREEN
SM_CYVIRTUALSCREEN
0x004E
0x004F
仮想画面のサイズ
SM_CXSCREEN
SM_CYSCREEN
0x0000
0x0001
ディスプレイ全体のサイズ
SM_ARRANGE0x0038最小化ウィンドウの配置方法を示す値
SM_CXEDGE
SM_CYEDGE
0x002D
0x002E
立体的なウィンドウの縁のサイズ
SM_CXBORDER
SM_CYBORDER
0x0005
0x0006
非立体的なウィンドウの縁のサイズ
SM_CXFULLSCREEN
SM_CYFULLSCREEN
0x0010
0x0011
最大化されたウィンドウのクライアント領域のサイズ
SM_CXMIN
SM_CYMIN
0x001C
0x001D
ウィンドウの最小サイズ
SM_CXMINIMIZED
SM_CYMINIMIZED
0x0039
0x003A
最小化されたウィンドウのデフォルトサイズ
SM_CXMAXIMIZED
SM_CYMAXIMIZED
0x003D
0x003E
最大化されたウィンドウのサイズ
SM_CXMINTRACK
SM_CYMINTRACK
0x0022
0x0023
ウィンドウの最小トラッキングサイズ
SM_CXMAXTRACK
SM_CYMAXTRACK
0x003B
0x003C
ウィンドウの最大トラッキングサイズ
SM_CXMINSPACING
SM_CYMINSPACING
0x002F
0x0030
最小化されたウィンドウの配置に使われるグリッドサイズ
SM_CXSIZE
SM_CYSIZE
0x001E
0x001F
ウィンドウのタイトルバー内のボタンのサイズ
SM_CXSMSIZE
SM_CYSMSIZE
0x0034
0x0035
小さいタイトルバー内のボタンのサイズ
SM_CXVSCROLL
SM_CYVSCROLL
0x0002
0x0003
スクロールバーのサイズ
SM_CXHSCROLL
SM_CYHSCROLL
0x0015
0x0016
スクロールバーの矢印のサイズ
SM_CXHTHUMB
SM_CYVTHUMB
0x000A
0x0009
スクロールバーのつまみサイズ
SM_CXICON
SM_CYICON
0x000B
0x000C
アイコンのサイズ
SM_CXICONSPACING
SM_CYICONSPACING
0x0026
0x0027
アイコンを整列する時のサイズ
SM_CXSMICON
SM_CYSMICON
0x0031
0x0032
小さいアイコンの推奨サイズ
SM_CXDOUBLECLK
SM_CYDOUBLECLK
0x0024
0x0025
ダブルクリックにおける2回目のクリック位置の許容サイズ
SM_CXDRAG
SM_CYDRAG
0x0044
0x0045
ドラッグ操作の開始とはみなされないサイズ
SM_CYMENU0x000F一行分のメニューバーの高さ
SM_CXMENUCHECK
SM_CYMENUCHECK
0x0047
0x0048
メニューのチェックマークサイズ
SM_CXMENUSIZE
SM_CYMENUSIZE
0x0036
0x0037
メニューバーに表示されるボタンのサイズ
SM_MENUDROPALIGNMENT0x0028メニューバーのドロップダウンメニューが右寄せされるか否か
SM_CYKANJIWINDOW0x0012ディスプレイ下の漢字ウィンドウの高さ
SM_DBCSENABLED0x002AUSER.EXEがダブルバイト文字セット(DBCS)をサポートしているか否か
SM_DEBUG0x0016USER.EXEがデバッグバージョンかどうかを示す値
SM_PENWINDOWS0x0029Window for Pen computing extensions がインストールされているか否か
SM_REMOTESESSION0x1000 Terminal Services のクライアントセッションに関連付されているか否か
SM_SHOWSOUNDS0x0046ユーザー補助の「サウンド解説を使う」が有効になっているか否か

wingetstyle 拡張スタイルフラグ
拡張スタイルフラグ現在の操作対象ウィンドウのうち、0又は省略すると標準ウィンドウスタイル、
それ以外を指定すると拡張ウィンドウスタイル値を取得する。
尚、取得結果はstatに代入する。

gsm 取得項目
取得項目取得するシステムメトリクス(画面構成やシステム設定情報のオブジェクトサイズ)定数値を指定する

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
	ll_libload user, "user32.dll"
	ll_getproc GetWindowLong, "GetWindowLongA", user
	ll_getproc GetSystemMetrics, "GetSystemMetrics", user

#module
#deffunc wingetstyle int
	mref extflg, 0
	mref stt, 64
	mref bmscr, 67
	prm = bmscr.13, -4 * (extflg ! 0) - 16
	ll_callfunc prm, 2, GetWindowLong@
	ll_ret i : stt = i
	return

#deffunc gsm int
	mref i, 0
	mref stt, 64
	ll_callfunc i, 1, GetSystemMetrics@
	ll_ret i : stt = i
	return
#global

#define getwakusize wingetstyle : gsm ((stat & 0x00040000) ! 0) * 0x0019 + 0x0007
#define getcaptionsize gsm 0x0004

	screen 0, 400, 300, , 100, 50
	title "サイズ不変ウィンドウ"
	getwakusize    : mes "枠幅は" + stat + "です"
	getcaptionsize : mes "タイトルバーの高さは" + stat + "です"
	getwakusize
	screen 2, 400, 300, , winx + stat + 100, 50
	title "サイズ可変ウィンドウ"
	getwakusize    : mes "枠幅は" + stat + "です"
	getcaptionsize : mes "タイトルバーの高さは" + stat + "です"
	stop
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#uselib "user32.dll"
#cfunc global GetSystemMetrics "GetSystemMetrics" int, int
#cfunc global GetWindowLong "GetWindowLongA" int, int

#define ctype getwakusize GetSystemMetrics(((GetWindowLong(hwnd, -16) & 0x00040000) ! 0) * 0x0019 + 0x0007)
#define ctype getcaptionsize GetSystemMetrics(0x0004)

	screen 0, 400, 300, , 100, 50
	title "サイズ不変ウィンドウ"
	mes "枠幅は" + getwakusize() + "です"
	mes "タイトルバーの高さは" + getcaptionsize() + "です"
	screen 2, 400, 300, , ginfo_winx + getwakusize() + 100, 50
	title "サイズ可変ウィンドウ"
	mes "枠幅は" + getwakusize() + "です"
	mes "タイトルバーの高さは" + getcaptionsize() + "です"