Неожиданное поведение Process.MainWindowHandle - PullRequest
10 голосов
/ 07 сентября 2008

Я пытался понять Process.MainWindowHandle .

По данным MSDN; «Главное окно - это окно, которое создается при запуске процесса. После инициализации могут открываться другие окна, в том числе окна Modal и TopLevel, но первое окно, связанное с процессом, остается главным окном «. (Акцент добавлен)

Но во время отладки я заметил, что MainWindowHandle, похоже, изменил значение ... чего я не ожидал, особенно после ознакомления с документацией выше.

Для подтверждения поведения я создал отдельное приложение WinForms с таймером, чтобы проверять MainWindowHandle процесса "DEVENV" (Visual Studio) каждые 100 мс.

Вот интересная часть этого тестового приложения ...

    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();
    }

Вы можете видеть, как значение MainWindowHandle меняется, когда вы (например) щелкаете раскрывающееся меню внутри VS.

MainWindowHandleMystery

Возможно, я неправильно понял документацию.

Может ли кто-нибудь пролить свет?

Ответы [ 2 ]

11 голосов
/ 07 сентября 2008

@ EDG,

Я полагаю, это ошибка в 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 перечисляет окна, совершенно очевидно, что первое видимое окно (т.е. окно верхнего уровня) будет соответствовать этому критерию.

5 голосов
/ 07 сентября 2008

На самом деле Process.MainWindowHandle - это дескриптор самого верхнего окна, на самом деле это не «дескриптор главного окна»

...