Неожиданное поведение Process.MainWindowHandle
Вопрос
Я пытался понять Process.MainWindowHandle.
Согласно MSDN;«Главное окно — это окно, которое создается при запуске процесса.После инициализации могут быть открыты другие окна, в том числе модальные и 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.
Возможно, я неправильно понял документацию.
Может ли кто-нибудь пролить свет?
Решение
@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 перечисляет окна, совершенно очевидно, что первое видимое окно (т.окно верхнего уровня) будет соответствовать этому критерию.
Другие советы
На самом деле Process.MainWindowHandle — это дескриптор самого верхнего окна, но на самом деле это не «Дескриптор главного окна».