ゲーム作成備忘録その2

すみません、また個人的なメモです。
読み流してやってくださいm(_ _)m


前回までのまとめ

1.
外部プログラムのHWNDを取得できれば、
sendmsgによって様々な処理ができる。

2.
ところが、HSPのシステム変数のhwndは、
HSPから起動されたHWNDしか保持していない。

3.
したがって、一番カンタンなのは、
HWNDを取得しなくてもいいような処理で
代用すること。

4.
ただし、ウィンドウの移動など
一部の機能が代用できていない


 ⇒結論、やっぱりHWNDを取得してメッセージを送りたい!

そこで、今回は、HSPから外部プログラムのHWNDを取得する方法を探る。


検索の結果、EnumWindowsというWINDOWSAPIを使うと、
HWNDを取得することができるらしい。


コールバックルーチンが必要になるので、ちょくとのページから、
hscallbk10をダウンロード。hsphelpに突っ込む用のHSファイルはこちら


以下は、任意のタイトルのウィンドウを捕獲して最小化するコード
(*が全角なのに注意)


#include "hscallbk.as"

#uselib "user32.dll"
#func GetWindowText "GetWindowTextA" int, int, int
#func EnumWindows "EnumWindows" int, int

;コールバック関数定義
#uselib ""
#func hogehoge "" int, int

sdim tmp, 129

setcallbk pEnumWindowsProc, hogehoge, *EnumWindowsProc
mes "処理中..." : EnumWindows varptr(pEnumWindowsProc)
mes "処理完了"

sendmsg hWnd_GET, $112, $F020 ;←(☆)
mes "取得したいウィンドウのタイトルに最小化メッセージを送りました"

stop


*EnumWindowsProc
hWindow = callbkarg(0)

GetWindowText hWindow, varptr(tmp), 128
if tmp = "" : return 1 ;名前のないウィンドウは無視(高速化)
if tmp = "取得したいウィンドウのタイトル" : hWnd_GET = hWindow

return

最大化したいときは、←(☆)の部分を
sendmsg hWnd_GET, $112, $F030


終了させたいときは、←(☆)の部分を
sendmsg hWnd_GET, $112, $F060


元のサイズに復元したいときは、←(☆)の部分を
sendmsg hWnd_GET, $112, $F120


ウィンドウを任意の位置に移動するときは、
(??? 調査中)わからずじまい(汗)