トップ回答者
トップレベルWindowの探し方

質問
すべての返信
-
GetParent でも取れるのですが、どういうコードを書かれたのでしょうか?
using System.Runtime.InteropServices; using System.Diagnostics; class Program { [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] public static extern IntPtr GetParent(IntPtr hWnd); static void Main(string[] args) { Debug.Print("{0:X8}", GetParent(new IntPtr(0x10696)).ToInt64()); } }
結果
00030666この Window だけ他とプロセスが違うので注意です。
-
0x270DEC を渡した時に、提示されたコードの初回の GetParent で、変数 rt の値には何がセットされるのでしょうか。
0x70DF0 (462320) を返さず、それ以外の値を返すそうですが、その値は実行するたびに変わる値ですか? それとも常に同じ値ですか? 同じ値だとしたら、Spy++ のウィンドウ検索で該当する HWND は見つかりますか?
また、GetParenthWnd に対してトップレベルウィンドウのハンドルを渡した場合、有効なトップレベルウィンドウではなく、IntPtr.Zero が返されるようになっているのは意図通りでしょうか? GetAncestor と同様にするなら、変数 buf の初期値は Zero ではなく、hWnd にしておくべきかと思います。
-
こう書き換えれば良さそうです。
private static IntPtr GetParenthWnd(IntPtr hWnd) { IntPtr rt = GetParent(hWnd); IntPtr buf = hWnd; while (rt != IntPtr.Zero) { buf = rt; rt = GetParent(rt); } return buf; }
# ただ、0x270DEC と 0x70DF0 なら取得できそうな気が・・・
あと、UWP のウインドウはデスクトップアプリから操作できないかもしれません。SetWindowPos は出来たので上の発言は取り消させてください。
- 編集済み KOZ6.0 2019年12月3日 4:13