〜 グラフィック 〜
デスクトップ内の任意の一点の色を取得 (要GDI32.DLL)

HSPウィンドウ内ならばpget命令で指定座標の色を取得することが可能ですが、
HSPウィンドウ外の座標を指定して色を取得することはできません。
pget命令は「API関数GetPixelの取得範囲をHSPウィンドウ内に限定したもの」であるので、
元となるAPI関数GetPixelの取得範囲をスクリーン全体に広げればデスクトップ内のどこでも取得可能です。
API関数GetPixel引数は第1引数から「デバイスコンテキストのハンドル」「X座標」「Y座標」です。
デバイスコンテキストは、HSPウィンドウ用、デスクトップ用…等々、それぞれに用意されてます。
HSPウィンドウのデバイスコンテキストハンドルはHSP2ならBMSCR構造体の要素4、
HSP3ならシステム変数hdcでそれぞれ取得することが出来ます。
今回必要なデスクトップ全体のデバイスコンテキストハンドルを取得するにはAPI関数CreateDCを使います。
API関数CreateDCには「ドライバ名」「デバイス名」「未使用項目」「オプション」を指定しますが、
デスクトップのデバイスコンテキストハンドル取得に必要なのは"DISPLAY"をドライバ名に指定するだけ。
当然のこと、指定するだけといっても直接渡せずに文字列格納先変数のポインタ値を指定することになるので、
HSP2の場合だと格納先変数のポインタを取得するという作業が必要になるわけですが。
API関数CreateDCを使ったら解放する必要もあるので、使い終わったらAPI関数DeleteDCも使います。
API関数DeleteDCの引数はAPI関数CreateDCの戻り値であるデバイスコンテキストハンドルだけです。
以上の流れをモジュールにしたサンプルを載せておきます。
	

pixget X座標, Y座標
X座標取得対象のスクリーン座標系X座標を指定する。
Y座標取得対象のスクリーン座標系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
26
27
28
29
30
31
	ll_libload gdi, "gdi32.dll"
	ll_getproc CreateDC, "CreateDCA", gdi
	ll_getproc DeleteDC, "DeleteDC", gdi
	ll_getproc GetPixel, "GetPixel", gdi

#module
#deffunc pixget int, int
	mref x, 0 : mref y, 1
	s = "DISPLAY"
	ll_getptr s : ll_ret prm
	prm.1 = 0, 0, 0
	ll_callfunc prm, 4, CreateDC@ : ll_ret prm
	prm.1 = x, y
	ll_callfunc prm, 3, GetPixel@ : ll_ret cols
	color cols & 0xFF, cols >> 8 & 0xFF, cols >> 16
	ll_callfunc prm, 1, DeleteDC@
	return
#global

	mes "マウスカーソル位置の色を表示しています"
	repeat
		wait 5
		redraw 0
		color : boxf 10, 30, 50, 70
		ginfo
		pixget prmx, prmy
		boxf 11, 31, 49, 69
		redraw 1
		pget 11, 31 // 各輝度をシステム変数に反映
		title "(" + rval + ", " + gval + ", " + bval + ")"
	loop

pixget X座標, Y座標
X座標取得対象のスクリーン座標系X座標を指定する。
Y座標取得対象のスクリーン座標系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
#uselib "gdi32.dll"
#cfunc global CreateDC "CreateDCA" str, int, int, int
#func  global DeleteDC "DeleteDC" int
#cfunc global GetPixel "GetPixel" int, int, int

#module
#deffunc pixget int x, int y, local i
	i.0 = CreateDC("DISPLAY")
	i.1 = GetPixel(i, x, y)
	color peek(i.1, 0), peek(i.1, 1), peek(i.1, 2)
	DeleteDC i
	return
#global

	mes "マウスカーソル位置の色を表示しています"
	repeat
		wait 5
		redraw 0
		color : boxf 10, 30, 50, 70
		pixget ginfo_mx, ginfo_my
		boxf 11, 31, 49, 69
		redraw 1
		title strf("(%d, %d, %d)", ginfo_r, ginfo_g, ginfo_b)
	loop