どんな場所でもマウス座標を取得 (要USER32.DLL)

マウスカーソルのある座標はシステム変数mousexmouseyで取得することができますが、
配置オブジェクト上にカーソルを移動させた場合、マウス座標は取得できません。
また、ウィンドウ領域を越えても、0よりは小さくなったり、ウィンドウサイズより大きくなりません。
ginfo命令・関数を使用することでどんな座標であっても取得することができるのですが、
取得する座標はHSPウィンドウ描画領域左上を基点に下クライアント座標ではなく、
ディスプレイ左上を基点としたスクリーン座標となるので、
「描画領域内だけ」または「描画領域より小さい(左or上)場合はマイナス」で取得できればよい場合、
つまり、mousexmouseyと同じ座標を取得したい場合は変換しなくてはなりません。
ginfo命令・関数を幾つか組み合わせることで、HSP描画領域左上基点を取得することもできますが、
ここではAPI関数ScreenToClientを使ってスクリーン座標をクライアント座標に変換します。

getmousepos 格納配列
格納配列取得座標の受取先配列変数を指定する。
尚、要素0にX、要素1にY座標が結果として格納される。

 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
	ll_libload user, "user32.dll"
	ll_getproc ScreenToClient, "ScreenToClient", user

#module
#deffunc getmousepos val, int
	mref mp, 48
	mref bmscr, 67
	ginfo 0
	mp = prmx, prmy
	ll_getptr mp : ll_ret ptr
	prm = bmscr.13, ptr
	ll_callfunc prm, 2, ScreenToClient@
	return
#global

	buf = "通常版と拡張版の違いをタイトルバーに表示します。"
	pos 10, 10 : button "終了", *exit
	pos 50, 50 : mesbox buf, 400, 300
	repeat
		getmousepos p
		title"拡張版(" + p.0 + " , " + p.1 + ") 通常版(" + mousex + " , " + mousey + ")"
		wait 5
	loop

*exit

座標 = getmousepos(取得座標)
座標取得した座標の受取先を指定する。
取得座標取得する座標(0:X 1:Y)のいずれかを指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#uselib "user32.dll"
#func  global ScreenToClient "ScreenToClient" int, var

#module
#defcfunc getmousepos int mode, local i
	i = ginfo(0), ginfo(1)
	ScreenToClient hwnd, i
	return i(limit(mode, 0, 1))
#global

	buf = "通常版と拡張版の違いをタイトルバーに表示します。"
	pos 10, 10 : button "終了", *exit
	pos 50, 50 : mesbox buf, 400, 300
	repeat
		title "拡張版(" + getmousepos() + " , " + getmousepos(1) + ") 通常版(" + mousex + " , " + mousey + ")"
		wait 3
	loop

*exit
	end