Domanda

Sto cercando di capire Processo.MainWindowHandle.

Secondo MSDN;"La finestra principale è la finestra che viene creata quando il processo è iniziato.Dopo l'inizializzazione, le altre finestre possono essere aperte, tra cui il Modale e finestre di livello superiore, ma la prima finestra associata con il processo rimane la finestra principale." (Enfasi aggiunta)

Ma durante il debug ho notato che MainWindowHandle sembrava cambiare il valore...che non mi aspettavo, soprattutto dopo aver consultato la documentazione di cui sopra.

Per confermare il comportamento che ho creato un autonomo WinForms app con un timer per controllare la MainWindowHandle del "DEVENV" (Visual Studio) processo ogni 100ms.

Ecco la parte interessante di questa applicazione di test di...

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

Si può vedere il valore di MainWindowHandle cambiare quando (ad esempio) fare clic sul menu a discesa all'interno di VS.

MainWindowHandleMystery

Forse ho frainteso la documentazione.

Qualcuno può far luce?

È stato utile?

Soluzione

@edg,

Credo che sia un errore in MSDN.Si può vedere chiaramente in Relfector, che "finestra Principale" check-in .NET si presenta come:

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

Quando .NET codice enumera windows, è abbastanza ovvio che prima finestra visibile (cioèfinestra di primo livello) corrispondono a questo criterio.

Altri suggerimenti

In Realtà Il Processo.MainWindowHandle è un handle di finestra in primo piano, non è davvero la "Finestra Principale"Handle

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top