〜 ウィンドウ 〜
タイトルバーのボタンを全てなくす (要USER32.DLL)

HSPの命令で作成したウィンドウは最小化・閉じるボタンが有効となっており処理することができますが、
必ずしも使えると便利な機能ではなく、時には最小化されたり閉じられると困る場合もあることでしょう。
API関数のSetWindowLongでウィンドウスタイルを変更できますが、
最小化・最大化ボタンの制御と違って閉じるボタンだけの制御はできないようで、
当然ながら閉じるボタン定数が用意されておらず、閉じるボタンを使用不可にする場合、
最小化・最大化ボタンもろとろ使用不可にする必要があります。
SetWindowLongは現在のスタイルに機能を付け加えるのではなく、
一からスタイルを設定する必要があるため、基本機能はそのままにボタンを除去するには、
現在のスタイルを取得するAPI関数であるGetWindowLongを併せて使います。
SetWindowLongで変更できるスタイルは、下記の2タイプ存在します。
境界線の有無やスクロールバーの付加等の標準ウィンドウスタイル変更「GWL_STYLE(-16)」と、
MDIウィンドウの作成や投下ウィンドウの作成等の拡張ウィンドウスタイル「GWL_EXSTYLE(-20)」のうち
今回は標準スタイルのメニューボックス「WS_SYSMENU(=0x00080000)」を操作対象とするので、
「新スタイル値 = GetWindowLongで取得した旧スタイル - WS_SYSMENU」で新スタイル値を求め、
SetWindowLongで設定するHSPウィンドウ(ハンドル)を指定し、
標準スタイル(GWL_STYLE)を新スタイルで更新するように処理すればOKです。
※別途API関数の定義をしておく必要があります。
尚、無効化するとボタンおよびシステムメニューによる閉じる操作はできなくなりますが、
「ALT+F4」やタスクマネージャによる強制終了等はそのまま使えます。
	

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

winsetstyle 拡張スタイルフラグ, 追加スタイル, 削除スタイル
拡張スタイルフラグ現在の操作対象ウィンドウのうち、0又は省略すると標準ウィンドウスタイル、
それ以外を指定すると拡張ウィンドウスタイル値を設定する。
追加スタイル現在のスタイルのほかに追加したいスタイル値を指定する。
削除スタイル現在のスタイルのうちで削除したいスタイル値を指定する。

 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
	ll_libload user, "user32.dll"
	ll_getproc GetWindowLong, "GetWindowLongA", user
	ll_getproc SetWindowLong, "SetWindowLongA", 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 winsetstyle int, int, int
	mref extflg, 0 : mref aprm, 1 : mref dprm, 2
	mref bmscr, 67
	wingetstyle
	prm = bmscr.13, -4 * (extflg ! 0) - 16, stat | aprm & (stat | aprm ^ dprm)
	ll_callfunc prm, 3, SetWindowLong@
	return
#global

	screen 0, 400, 300, 2
	winsetstyle , , 0x80000 // WS_SYSMENU
	gsel 0, 1
	mes "終了は「ALT+F4」で。"
	stop

取得スタイル = wingetstyle(拡張スタイルフラグ)
取得スタイル取得したスタイル値の受取先を指定する。
拡張スタイルフラグ現在の操作対象ウィンドウのうち、0又は省略すると標準ウィンドウスタイル、
それ以外を指定すると拡張ウィンドウスタイル値を取得する。

winsetstyle 拡張スタイルフラグ, 追加スタイル, 削除スタイル
拡張スタイルフラグ現在の操作対象ウィンドウのうち、0又は省略すると標準ウィンドウスタイル、
それ以外を指定すると拡張ウィンドウスタイル値を設定する。
追加スタイル現在のスタイルのほかに追加したいスタイル値を指定する。
削除スタイル現在のスタイルのうちで削除したいスタイル値を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#uselib "user32.dll"
#cfunc global GetWindowLong "GetWindowLongA" int, int
#func  global SetWindowLong "SetWindowLongA" int, int, int

#module
#defcfunc wingetstyle int extflg
	return  GetWindowLong( hwnd, -4 * (extflg ! 0) - 16 )

#deffunc winsetstyle int extflg, int aprm, int dprm, local i
	SetWindowLong hwnd, -4 * (extflg ! 0) - 16, wingetstyle() | aprm & (wingetstyle() | aprm^ dprm)
	return
#global

	screen 0, 400, 300, 2
	winsetstyle , , 0x80000 // WS_SYSMENU
	gsel 0, 1
	mes "終了は「ALT+F4」で。"