#uselib "user32.dll"
#cfunc GetDesktopWindow "GetDesktopWindow"
#cfunc GetTopWindow "GetTopWindow" int
#cfunc GetWindow "GetWindow" int, int
#define GW_HWNDNEXT 2
#cfunc IsWindowVisible "IsWindowVisible" int
#func GetWindowText "GetWindowTextA" int, int, int
#define NULL 0
#define MAX_DETECT 256 //検出する最大個数
dim hwndList, MAX_DETECT //検出したウィンドウハンドルのリスト
sdim wTitleList, 256, MAX_DETECT //検出したウィンドウのタイトルのリスト
num_detected = 0 //検出カウンタ
sdim buf,256 //汎用変数
hwnd_desktop = GetDesktopWindow() //デスクトップのハンドル。(Windowsではデスクトップが他のトップレベルウィンドウの親になっているらしい。)
hwnd_ = GetTopWindow(hwnd_desktop) //デスクトップ傘下のトップレベルウィンドウで、Zオーダーが最大(ざっくり言えば「一番上に浮かんでいる」)のもの。
if hwnd_ { //そいつが空でない(→居る)なら
GetWindowText hwnd_,varptr(buf),256 //タイトルバー文字列
if strlen(buf) { //名無しでないなら登録する
hwndList(num_detected) = hwnd_
wTitleList(num_detected) = buf
num_detected ++
}
repeat //最下のウィンドウまで繰り返す
hwnd_ = GetWindow(hwnd_,GW_HWNDNEXT)
if hwnd_ {
if IsWindowVisible(hwnd_) {
GetWindowText hwnd_,varptr(buf),256
if strlen(buf) {
hwndList(num_detected) = hwnd_
wTitleList(num_detected) = buf
MAX_DETECT ++
}
}
} else : break
if MAX_DETECT == MAX_DETECT : break //お腹一杯
loop
}
mes ""+num_detected+"個のウィンドウを検出しました。\n"
repeat num_detected
mes wTitleList(cnt)
loop
こんな風にして取得できます。この例では「可視 & ウィンドウタイトル1文字以上」のものを検出しています。
ただし、「スタートボタン」等も網にかかるので気をつけてください。
特定のウィンドウに関してはクラス名等で弾く必要があるかも知れません。
MSDNの説明では、GetWindow の繰り返しで列挙するよりも EnumWindows を使うほうが確実で安全であるとのことです。
この場合はコールバック関数が必要になるので、HSP用コールバック関数モジュールを利用するのが良いと思います。