Question

J'ai essayé de comprendre Processus.MainWindowHandle.

Selon MSDN ;"La fenêtre principale est la fenêtre créée au démarrage du processus.Après l'initialisation, d'autres fenêtres peuvent être ouvertes, notamment les fenêtres Modal et TopLevel, mais la première fenêtre associée au processus reste la fenêtre principale. " (C'est nous qui soulignons)

Mais lors du débogage, j'ai remarqué que MainWindowHandle semblait changer de valeur...ce à quoi je ne m'attendais pas, surtout après avoir consulté la documentation ci-dessus.

Pour confirmer le comportement, j'ai créé une application WinForms autonome avec une minuterie pour vérifier le MainWindowHandle du processus "DEVENV" (Visual Studio) toutes les 100 ms.

Voici la partie intéressante de cette application de test...

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

Vous pouvez voir la valeur de MainWindowHandle changer lorsque vous cliquez (par exemple) sur un menu déroulant dans VS.

MainWindowHandleMystery

Peut-être ai-je mal compris la documentation.

Quelqu'un peut-il nous éclairer ?

Était-ce utile?

La solution

@edg,

Je suppose que c'est une erreur dans MSDN.Vous pouvez clairement voir dans Relfector que la vérification de la "Fenêtre principale" dans .NET ressemble à :

private bool IsMainWindow(IntPtr handle)
{
    return (!(NativeMethods.GetWindow(new HandleRef(this, handle), 4) != IntPtr.Zero)  
             && NativeMethods.IsWindowVisible(new HandleRef(this, handle)));
}

Lorsque le code .NET énumère les fenêtres, il est assez évident que la première fenêtre visible (c'est-à-direfenêtre de niveau supérieur) correspondra à ces critères.

Autres conseils

En fait, Process.MainWindowHandle est un handle de la fenêtre la plus haute, ce n'est pas vraiment le "Handle de la fenêtre principale"

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top