アクティブ判定

NScr.exeがアクティブかそうでないかを取得するプラグインを作成しました。
http://www.eiji8pou.pics/download/active20120312.zip

どういうものか

レイヤー型・一般型の両方で扱えるプラグインです。

レイヤー型として使う場合

まず、define節でsetlayerを実行します。

setlayer 10,25,"is_active_window.dll"
; 10の部分は適当な数値です。
; 25の部分は25ミリ秒に一度実行すると言う意味です。

次にstart節で、スプライトと結びつけます。

lsp 0,"*10"
; 10はsetlayerでの「適当な数値」です。

こうすると、nscr.exeがアクティブな間は何もしませんが、Windows上の他のアプリ(例えばブラウザ)などがアクティブになると、画面を真っ黒に塗りつぶします。
レイヤーに結びつけるスプライトはできるだけ手前の番号が若いスプライトの方がいいでしょう。

一般型として使う場合

exec_dll "is_active_window.dll"
getret %0

%0にnscr.exeがアクティブかどうかが入ります。0なら非アクティブ、1ならアクティブです。

使い道

ボスが来た時とかに便利じゃないでしょうか。
nsluaのluacall animationなどと組み合わせて使って、非アクティブな間は画面を真っ暗、あるいは準備したダミー画面やダミー動画を流し、全ての音声を一時的にミュートにする処理などをはさむとよいのではないでしょうか。アクティブになったら復帰するような。

サンプル

do
	-- プラグインの名前
	local plugin_name = "is_active_window.dll"
	-- これで使う変数の番号
	local var = 999

	-- アクティブかどうかを調べて返す命令
	function is_active_window()
		NSExec("_exec_dll \""..plugin_name.."\"")
		NSExec("_getret %"..tostring(var))
		return NSGetIntValue(var)==1
	end
	
	-- 前回の調査結果
	local last_flag = true

	-- ボスが来たときの処理
	function boss_come()
		-- ここにボスが来た時の処理を書く。
	end
	
	-- ボスが来たときの処理
	function boss_go()
		-- ここにボスが去った時の処理を書く。
	end
	
	-- この関数active_window_checkを、NSCALL_animationの中から呼び出す。
	-- また、この関数はtrue/falseを返す。trueなら、NSUpdateの要ありの意味。
	function active_window_check()
		local active = is_active_window() -- 現在の状態を調べる。
		-- 現在の状態と直前の状態が同じなら、何もせずに終了。
		if active==last_flag then
			last_flag = active
			return false
		end
		-- 違うなら、何かする。
		if active then -- 非アクティブから復帰したならば、
			boss_go() -- ボスがいなくなった時の処理をする。
		else
			boss_come() -- ボスが来た時の処理をする。
		end
		last_flag = active
		return true
	end
end

ただし、NSCALL_animationによる処理は、bexecなどでのクリック待ち中は反応しませんので、それ用にbexecを上書きする必要があります。