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.

MainWindowHandleMystery

Talvez eu tenha entendido mal a documentação.

Alguém pode lançar luz?

Foi útil?

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"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top