HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0919
ニボッシー現在開いているウィンドウをリスト化したい3解決


ニボッシー

リンク

2015/9/19(Sat) 14:28:56|NO.71794

開いているウィンドウをまとめて処理がしたいため、
ウィンドウをリスト化したいのですがなにかいい方法はないでしょうか?
FindWindowを使ってクラス名を使ったものに対しては取得できますが、
全ウィンドウに対してやる方法が分からなかったため質問させていただきました。
よろしくお願いします。


#uselib "USER32.DLL" #cfunc FindWindow "FindWindowA" sptr, sptr notesel WindowList WindowCheck = FindWindow("Notepad", 0) if WindowCheck!0 : WindowList+=""+WindowCheck+"\r" WindowCheck = FindWindow("CalcFrame", 0) if WindowCheck!0 : WindowList+=""+WindowCheck+"\r" dialog WindowList end




この記事に返信する


motchy

リンク

2015/9/19(Sat) 16:57:02|NO.71797


#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用コールバック関数モジュールを利用するのが良いと思います。



motchy

リンク

2015/9/19(Sat) 17:01:01|NO.71798

↑に間違いがありました。

33行目の

MAX_DETECT ++


num_detected ++
に、

37行目の

if MAX_DETECT == MAX_DETECT : break //お腹一杯


if num_detected == MAX_DETECT : break //お腹一杯
にそれぞれ変更してください。



ニボッシー

リンク

2015/9/19(Sat) 17:48:48|NO.71799

>motchyさん
まさにやりたいことでした!
タイトルの取得も今勉強していたのですがうまく出来なかったので非常に助かりました!
ありがとうございました!



ONION software Copyright 1997-2023(c) All rights reserved.