10

Process.MainWindowHandleを理解しようとしています。

MSDNによると; 「メイン ウィンドウは、プロセスの開始時に作成されるウィンドウです。初期化後、モーダル ウィンドウやトップレベル ウィンドウを含む他のウィンドウを開くことができますが、プロセスに関連付けられた最初のウィンドウはメイン ウィンドウのままです。」(強調を追加)

しかし、デバッグ中に MainWindowHandle が値を変更しているように見えることに気付きました...特に上記のドキュメントを参照した後、これは予期していませんでした。

動作を確認するために、100ms ごとに "DEVENV" (Visual Studio) プロセスの MainWindowHandle をチェックするタイマーを備えたスタンドアロンの WinForms アプリを作成しました。

このテストアプリの興味深い部分は次のとおりです...

    IntPtr oldHWnd = IntPtr.Zero;

    void GetMainwindowHandle()
    {
        Process[] processes = Process.GetProcessesByName("DEVENV");

        if (processes.Length!=1)
            return;

        IntPtr newHWnd = processes[0].MainWindowHandle;

        if (newHWnd != oldHWnd)
        {
            oldHWnd = newHWnd;
            textBox1.AppendText(processes[0].MainWindowHandle.ToString("X")+"\r\n");
        }

    }

    private void timer1Tick(object sender, EventArgs e)
    {
        GetMainwindowHandle();
    }

(たとえば) VS 内のドロップダウン メニューをクリックすると、MainWindowHandle の値が変化することがわかります。

MainWindowハンドルミステリー

おそらく私はドキュメントを誤解しました。

誰でも光を当てることができますか?

4

2 に答える 2

11

@エッジ、

MSDNのエラーだと思います。Relfector では、.NET の「メイン ウィンドウ」チェックが次のようになっていることがはっきりとわかります。

private bool IsMainWindow(IntPtr handle)
{
    return (!(NativeMethods.GetWindow(new HandleRef(this, handle), 4) != IntPtr.Zero)  
             && NativeMethods.IsWindowVisible(new HandleRef(this, handle)));
}

.NET コードがウィンドウを列挙する場合、最初に表示されるウィンドウ (つまり、最上位のウィンドウ) がこの基準に一致することは明らかです。

于 2008-09-07T11:06:14.630 に答える
5

実際には Process.MainWindowHandle は一番上のウィンドウのハンドルであり、実際には「メイン ウィンドウ ハンドル」ではありません。

于 2008-09-07T10:39:22.960 に答える