none
トップレベルWindowの探し方 RRS feed

  • 質問

  • お世話になっております。

    目的は、マウスの下にあるWindowを掴んで移動させたいです。
    その際に、そのWindowをトップレベルで移動させるのですが
    指定ハンドルから、親ハンドルを取る際に【GetParent】APIを使用しています。
    これで、取得してもSpy++で取得した値と異なってしまいます。

    この場合、270DECの値を渡し70DF0を取得したいのに、よくわからない値を
    取得してしまいます。
    目的とする行為に対しこのAPIは間違っているのでしょうか?

    2019年12月2日 11:23

回答

すべての返信

  • 自己解決:【GetAncestor】で取得できました。
    • 回答としてマーク コーベル 2019年12月2日 23:06
    2019年12月2日 23:06
  • 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 だけ他とプロセスが違うので注意です。

    • 回答としてマーク コーベル 2019年12月3日 1:18
    • 回答としてマークされていない コーベル 2019年12月3日 1:19
    2019年12月3日 0:22
  • private IntPtr GetParenthWnd(IntPtr hWnd)
    {
        IntPtr rt = GetParent(hWnd);
        IntPtr buf = IntPtr.Zero;
    
        while ((int)rt > 0) {
            buf = rt;
            rt = GetParent(rt);
        }
    
        return buf;
    }
    です。
    2019年12月3日 1:18
  • 0x270DEC を渡した時に、提示されたコードの初回の GetParent で、変数 rt の値には何がセットされるのでしょうか。

    0x70DF0 (462320) を返さず、それ以外の値を返すそうですが、その値は実行するたびに変わる値ですか? それとも常に同じ値ですか? 同じ値だとしたら、Spy++ のウィンドウ検索で該当する HWND は見つかりますか?

    また、GetParenthWnd に対してトップレベルウィンドウのハンドルを渡した場合、有効なトップレベルウィンドウではなく、IntPtr.Zero が返されるようになっているのは意図通りでしょうか? GetAncestor と同様にするなら、変数 buf の初期値は Zero ではなく、hWnd にしておくべきかと思います。

    2019年12月3日 1:48
  • こう書き換えれば良さそうです。

    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
    2019年12月3日 1:58