Come faccio a fare in modo che un'app WinForms vada a schermo intero


109

Ho un'app WinForms che sto cercando di rendere a schermo intero (un po 'come quello che fa VS in modalità a schermo intero).

Attualmente mi sto mettendo FormBorderStylea Noneed WindowStatea Maximizedche mi dà un po 'più spazio, ma non copre sopra la barra delle applicazioni se è visibile.

Cosa devo fare per utilizzare anche quello spazio?

Per i punti bonus, c'è qualcosa che posso fare per fare in modo che il mio MenuStripautohide rinunci anche a quello spazio?

Risposte:


150

Alla domanda di base, quanto segue farà il trucco (nascondendo la barra delle applicazioni)

private void Form1_Load(object sender, EventArgs e)
{
    this.TopMost = true;
    this.FormBorderStyle = FormBorderStyle.None;
    this.WindowState = FormWindowState.Maximized;
}

Ma, cosa interessante, se si scambiano queste ultime due righe, la barra delle applicazioni rimane visibile. Penso che la sequenza di queste azioni sarà difficile da controllare con la finestra delle proprietà.


4
Il problema degli ordini è il motivo per cui prima non funzionava per me. In realtà stavo impostando le proprietà in quell'ordine, ma quando il modulo è già ingrandito, l'impostazione del bordo su nessuno non si espande per coprire la barra delle applicazioni. Ho aggirato "ripristinando" il modulo cambiando il bordo e quindi ingrandendolo.

3
Ce l'ho nell'ordine giusto e non funziona. La barra delle applicazioni è sempre visibile e l'app non è al di sotto di essa, ha lasciato solo spazio libero per la barra delle applicazioni lì. (Win7)
Preza8

@ Preza8 - leggi il commento di Grady, controlla se questo si applica alla tua situazione.
Henk Holterman

1
Mi dispiace, non sono online da molto tempo e ho dimenticato come ho fatto ma ricordo che dopo qualche tentativo di ordine casuale di quei comandi aiuta.
Preza8

Nota: per qualche motivo ho dovuto impostare le proprietà E inserirlo nel codice
Joe Phillips

22

Una soluzione semplice e collaudata

Ho cercato una risposta a questa domanda in SO e in altri siti, ma una risposta è stata molto complessa per me e altre risposte semplicemente non funzionano correttamente, quindi dopo molti test del codice ho risolto questo puzzle.

Nota: sto usando Windows 8 e la mia barra delle applicazioni non è in modalità Nascondi automaticamente.

Ho scoperto che l'impostazione di WindowState su Normal prima di eseguire qualsiasi modifica interromperà l'errore con la barra delle applicazioni non coperta.

Il codice

Ho creato questa classe che ha due metodi, il primo entra in "modalità a schermo intero" e il secondo esce dalla "modalità a schermo intero". Quindi devi solo creare un oggetto di questa classe e passare il Form che vuoi impostare a schermo intero come argomento al metodo EnterFullScreenMode o al metodo LeaveFullScreenMode:

class FullScreen
{
    public void EnterFullScreenMode(Form targetForm)
    {
        targetForm.WindowState = FormWindowState.Normal;
        targetForm.FormBorderStyle = FormBorderStyle.None;
        targetForm.WindowState = FormWindowState.Maximized;
    }

    public void LeaveFullScreenMode(Form targetForm)
    {
        targetForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
        targetForm.WindowState = FormWindowState.Normal;
    }
}

Esempio di utilizzo

    private void fullScreenToolStripMenuItem_Click(object sender, EventArgs e)
    {
        FullScreen fullScreen = new FullScreen();

        if (fullScreenMode == FullScreenMode.No)  // FullScreenMode is an enum
        {
            fullScreen.EnterFullScreenMode(this);
            fullScreenMode = FullScreenMode.Yes;
        }
        else
        {
            fullScreen.LeaveFullScreenMode(this);
            fullScreenMode = FullScreenMode.No;
        }
    }

Ho posto la stessa risposta su un'altra domanda che non sono sicuro se sia un duplicato o meno di questa. (Collegamento all'altra domanda: come visualizzare un Windows Form a schermo intero nella parte superiore della barra delle applicazioni? )


2
Per curiosità, perché hai un intero enum per descrivere una condizione vero / falso?
Nathan Ridley

2
L'ho scritto molto tempo fa, quando stavo solo imparando a scrivere codice, per favore fa attenzione al mio giovane stupore. In effetti non ha alcun senso e avrei dovuto semplicemente usare un tipo booleano.
Zignd

Ha funzionato per me e ho dovuto impostare anche targetForm.WindowState = FormWindowState.Normal;l'inizio di lasciare lo schermo intero. Quello per gestire il caso in cui l'utente sta andando a schermo intero da una finestra ingrandita.
gneri

6

E per il menustrip-question, prova il set

MenuStrip1.Parent = Nothing

in modalità a schermo intero, dovrebbe quindi scomparire.

E quando si esce dalla modalità a schermo intero, reimpostare menustrip1.parentnuovamente il modulo e il menu tornerà di nuovo normale.


5

È possibile utilizzare il codice seguente per adattarlo allo schermo del sistema e la barra delle applicazioni è visibile.

    private void Form1_Load(object sender, EventArgs e)
    {   
        // hide max,min and close button at top right of Window
        this.FormBorderStyle = FormBorderStyle.None;
        // fill the screen
        this.Bounds = Screen.PrimaryScreen.Bounds;
    }

Non c'è bisogno di usare:

    this.TopMost = true;

Quella linea interferisce con il alt+tabpassaggio a un'altra applicazione. ("TopMost" significa che la finestra rimane in primo piano rispetto alle altre finestre, a meno che non siano anche contrassegnate come "TopMost".)


4

Recentemente ho creato un'applicazione Mediaplayer e ho utilizzato le chiamate API per assicurarmi che la barra delle applicazioni fosse nascosta quando il programma era in esecuzione a schermo intero e quindi ripristinato la barra delle applicazioni quando il programma non era a schermo intero o non era attivo o era stato chiuso.

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Integer, ByVal nCmdShow As Integer) As Integer

Sub HideTrayBar()
    Try


        Dim tWnd As Integer = 0
        Dim bWnd As Integer = 0
        tWnd = FindWindow("Shell_TrayWnd", vbNullString)
        bWnd = FindWindowEx(tWnd, bWnd, "BUTTON", vbNullString)
        ShowWindow(tWnd, 0)
        ShowWindow(bWnd, 0)
    Catch ex As Exception
        'Error hiding the taskbar, do what you want here..
    End Try
End Sub
Sub ShowTraybar()
    Try
        Dim tWnd As Integer = 0
        Dim bWnd As Integer = 0
        tWnd = FindWindow("Shell_TrayWnd", vbNullString)
        bWnd = FindWindowEx(tWnd, bWnd, "BUTTON", vbNullString)
        ShowWindow(bWnd, 1)
        ShowWindow(tWnd, 1)
    Catch ex As Exception
    'Error showing the taskbar, do what you want here..     
               End Try


End Sub

6
E se due programmi lo facessero? Cosa succede se il tuo programma si arresta in modo anomalo prima che abbia la possibilità di mostrare la barra delle applicazioni?
Tmdean

@Tmdean: Nel mio caso non è stato un problema, questo programma era in esecuzione su mashine che era dedicato a eseguire solo il mio programma sugli schermi nelle sale d'attesa.
Stefan

@Tmdean: Il punto sul fatto che se due programmi lo facessero è valido, potrebbe rovinare le cose se non gestito correttamente.
Stefan,

2

È necessario impostare la finestra in modo che sia in alto.


1
Niente da fare. Anche se imposto la finestra in alto, non copre la barra delle applicazioni.

3
Prova: Bounds = Screen.PrimaryScreen.Bounds; codeproject.com/KB/cs/scrframework.aspx ha più dettagli, come per multimon
Tron

1

Non so se funzionerà su .NET 2.0, ma mi ha funzionato su .NET 4.5.2. Ecco il codice:

using System;
using System.Drawing;
using System.Windows.Forms;

public partial class Your_Form_Name : Form
{
    public Your_Form_Name()
    {
        InitializeComponent();
    }

    // CODE STARTS HERE

    private System.Drawing.Size oldsize = new System.Drawing.Size(300, 300);
    private System.Drawing.Point oldlocation = new System.Drawing.Point(0, 0);
    private System.Windows.Forms.FormWindowState oldstate = System.Windows.Forms.FormWindowState.Normal;
    private System.Windows.Forms.FormBorderStyle oldstyle = System.Windows.Forms.FormBorderStyle.Sizable;
    private bool fullscreen = false;
    /// <summary>
    /// Goes to fullscreen or the old state.
    /// </summary>
    private void UpgradeFullscreen()
    {
        if (!fullscreen)
        {
            oldsize = this.Size;
            oldstate = this.WindowState;
            oldstyle = this.FormBorderStyle;
            oldlocation = this.Location;
            this.WindowState = System.Windows.Forms.FormWindowState.Normal;
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.Bounds = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
            fullscreen = true;
        }
        else
        {
            this.Location = oldlocation;
            this.WindowState = oldstate;
            this.FormBorderStyle = oldstyle;
            this.Size = oldsize;
            fullscreen = false;
        }
    }

    // CODE ENDS HERE
}

Uso:

UpgradeFullscreen(); // Goes to fullscreen
UpgradeFullscreen(); // Goes back to normal state
// You don't need arguments.

Avviso: È NECESSARIO inserirlo nella classe del modulo (Esempio:) partial class Form1 : Form { /* Code goes here */ }o non funzionerà perché se non lo si posiziona su alcun modulo, il codice thiscreerà un'eccezione.


1

Nel modulo Sposta evento aggiungi questo:

private void Frm_Move (object sender, EventArgs e)
{
    Top = 0; Left = 0;
    Size = new System.Drawing.Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
}

1

Ho lavorato all'idea di Zingd e l'ho resa più semplice da usare.

Ho anche aggiunto il tasto F11 standard per attivare la modalità a schermo intero.

Impostare

Tutto è ora nella classe FullScreen, quindi non devi dichiarare un mucchio di variabili nel tuo Form. Devi solo installare un oggetto FullScreen nel costruttore del tuo modulo:

FullScreen fullScreen;

public Form1()
{
    InitializeComponent();
    fullScreen = new FullScreen(this);
}

Tieni presente che questo presuppone che il modulo non sia ingrandito quando crei l'oggetto FullScreen.

uso

Devi solo usare una delle funzioni della classe per attivare la modalità a schermo intero:

fullScreen.Toggle();

o se devi gestirlo esplicitamente:

fullScreen.Enter();
fullScreen.Leave();

Codice

using System.Windows.Forms;


class FullScreen
{ 
    Form TargetForm;

    FormWindowState PreviousWindowState;

    public FullScreen(Form targetForm)
    {
        TargetForm = targetForm;
        TargetForm.KeyPreview = true;
        TargetForm.KeyDown += TargetForm_KeyDown;
    }

    private void TargetForm_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyData == Keys.F11)
        {
            Toggle();
        }
    }

    public void Toggle()
    {
        if (TargetForm.WindowState == FormWindowState.Maximized)
        {
            Leave();
        }
        else
        {
            Enter();
        }
    }
        
    public void Enter()
    {
        if (TargetForm.WindowState != FormWindowState.Maximized)
        {
            PreviousWindowState = TargetForm.WindowState;
            TargetForm.WindowState = FormWindowState.Normal;
            TargetForm.FormBorderStyle = FormBorderStyle.None;
            TargetForm.WindowState = FormWindowState.Maximized;
        }
    }
      
    public void Leave()
    {
        TargetForm.FormBorderStyle = FormBorderStyle.Sizable;
        TargetForm.WindowState = PreviousWindowState;
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.