Comportamento inesperado de Process.MainWindowHandle
Pergunta
Eu tenho tentado entender Process.MainWindowHandle.
De acordo com o MSDN;"A janela principal é a janela criada quando o processo é iniciado.Após a inicialização, outras janelas poderão ser abertas, incluindo as janelas Modal e TopLevel, mas a primeira janela associada ao processo continua sendo a janela principal." (Enfase adicionada)
Mas durante a depuração notei que MainWindowHandle parecia mudar de valor...o que eu não esperava, principalmente depois de consultar a documentação acima.
Para confirmar o comportamento criei um aplicativo WinForms autônomo com um timer para verificar o MainWindowHandle do processo "DEVENV" (Visual Studio) a cada 100ms.
Aqui está a parte interessante deste aplicativo de teste...
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();
}
Você pode ver o valor de MainWindowHandle mudando quando você (por exemplo) clica em um menu suspenso dentro do VS.
Talvez eu tenha entendido mal a documentação.
Alguém pode lançar luz?
Solução
@edg,
Acho que é um erro no MSDN.Você pode ver claramente no Relfector que a verificação da "janela principal" no .NET se parece com:
private bool IsMainWindow(IntPtr handle)
{
return (!(NativeMethods.GetWindow(new HandleRef(this, handle), 4) != IntPtr.Zero)
&& NativeMethods.IsWindowVisible(new HandleRef(this, handle)));
}
Quando o código .NET enumera janelas, é bastante óbvio que a primeira janela visível (ou seja,janela de nível superior) corresponderá a este critério.
Outras dicas
Na verdade Process.MainWindowHandle é um identificador da janela superior, não é realmente o "Identificador da janela principal"