Неожиданное поведение Process.MainWindowHandle
Я пытался понять 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 http://i37.tinypic.com/11ky1yb.jpg
Возможно, я неправильно понял документацию.
Может ли кто-нибудь пролить свет?
Ответы
Ответ 1
@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-код перечисляет окна, довольно очевидно, что первое видимое окно (то есть окно верхнего уровня) будет соответствовать этим критериям.
Ответ 2
На самом деле Process.MainWindowHandle - это дескриптор самого верхнего окна, это не "Ручка главного окна"