Comment faire en sorte qu'une application WinForms passe en plein écran

109

J'ai une application WinForms que j'essaie de faire en plein écran (un peu comme ce que VS fait en mode plein écran).

Actuellement, je suis en train FormBorderStylede configurer Noneet WindowStatevers Maximizedce qui me donne un peu plus d'espace, mais cela ne couvre pas la barre des tâches si elle est visible.

Que dois-je faire pour utiliser cet espace également?

Pour les points bonus, puis-je faire quelque chose pour que mon MenuStripmasquage automatique renonce également à cet espace?

Les divins Mathew
la source

Réponses:

150

Pour la question de base, ce qui suit fera l'affaire (masquer la barre des tâches)

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

Mais, fait intéressant, si vous permutez ces deux dernières lignes, la barre des tâches reste visible. Je pense que la séquence de ces actions sera difficile à contrôler avec la fenêtre des propriétés.

Henk Holterman
la source
4
Le problème de la commande est pourquoi cela ne fonctionnait pas pour moi avant. Je définissais en fait les propriétés dans cet ordre, mais lorsque le formulaire est déjà agrandi, la définition de la bordure sur aucune ne s'étend pas pour couvrir la barre des tâches. J'ai travaillé en "restaurant" la forme en changeant la bordure puis en la maximisant.
3
Je l'ai dans le bon ordre et cela ne fonctionne pas. La barre des tâches est toujours visible et l'application n'est pas en dessous, elle vient de laisser libre cours à la barre des tâches. (Win7)
Preza8
@ Preza8 - lisez le commentaire de Grady, vérifiez si cela s'applique à votre situation.
Henk Holterman
1
Je suis désolé, je ne suis pas en ligne ici depuis longtemps et j'ai oublié comment je l'ai fait, mais je me souviens qu'après avoir essayé un ordre aléatoire de ces commandes, cela aide.
Preza8
Remarque: pour une raison quelconque, j'ai dû définir les propriétés ET mettre cela dans le code
Joe Phillips
22

Une solution testée et simple

J'ai cherché une réponse à cette question dans SO et sur certains autres sites, mais l'un d'eux m'a donné une réponse très complexe et d'autres réponses ne fonctionnent tout simplement pas correctement, donc après de nombreux tests de code, j'ai résolu ce casse-tête.

Remarque: j'utilise Windows 8 et ma barre des tâches n'est pas en mode de masquage automatique.

J'ai découvert que la définition de WindowState sur Normal avant d'effectuer des modifications arrêterait l'erreur avec la barre des tâches non couverte.

Le code

J'ai créé cette classe qui a deux méthodes, la première entre en "mode plein écran" et la seconde quitte le "mode plein écran". Il vous suffit donc de créer un objet de cette classe et de transmettre le formulaire que vous souhaitez définir en plein écran comme argument à la méthode EnterFullScreenMode ou à la méthode 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;
    }
}

Exemple d'utilisation

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

J'ai placé cette même réponse sur une autre question dont je ne sais pas si c'est un double ou non de celle-ci. (Lien vers l'autre question: Comment afficher un Windows Form en plein écran en haut de la barre des tâches? )

Zignd
la source
2
Par curiosité, pourquoi avez-vous une énumération complète pour décrire une condition vraie / fausse?
Nathan Ridley
2
J'ai écrit ceci il y a longtemps alors que je ne saisis que pour écrire du code, faites attention à ma jeune stupidité. Cela n'a en effet aucun sens et j'aurais dû simplement utiliser un type booléen.
Zignd le
Cela a fonctionné pour moi, et j'ai dû régler targetForm.WindowState = FormWindowState.Normal;au début de quitter le plein écran également. Celui pour gérer le cas où l'utilisateur passe en plein écran à partir d'une fenêtre agrandie.
gneri
6

Et pour la menustrip-question, essayez set

MenuStrip1.Parent = Nothing

en mode plein écran, il devrait alors disparaître.

Et lorsque vous quittez le mode plein écran, réinitialisez menustrip1.parentà nouveau le formulaire et la barre de menus redeviendra normale.

Stefan
la source
5

Vous pouvez utiliser le code suivant pour s'adapter à votre écran système et la barre des tâches est visible.

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

Pas besoin d'utiliser:

    this.TopMost = true;

Cette ligne interfère alt+tabpour passer à une autre application. ("TopMost" signifie que la fenêtre reste au-dessus des autres fenêtres, sauf si elles sont également marquées "TopMost".)

Raghavendra Devraj
la source
4

J'ai récemment créé une application Mediaplayer et j'ai utilisé des appels API pour m'assurer que la barre des tâches était masquée lorsque le programme s'exécutait en plein écran, puis j'ai restauré la barre des tâches lorsque le programme n'était pas en plein écran ou n'avait pas le focus ou était sorti.

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
Stefan
la source
6
Et si deux programmes faisaient cela? Que faire si votre programme se bloque avant d'avoir la possibilité d'afficher la barre des tâches?
Tmdean
@Tmdean: Dans mon cas, ce n'était pas un problème, ce programme fonctionnait sur des mashines qui étaient dédiés à exécuter uniquement mon programme sur les écrans des salles d'attente.
Stefan
@Tmdean: Le fait de savoir si deux programmes ont fait cela est valide, cela pourrait gâcher les choses s'il n'est pas géré correctement.
Stefan
2

Vous devez définir votre fenêtre pour qu'elle soit la plus haute.

Tron
la source
1
Pas de dé. Même si je configure la fenêtre pour qu'elle soit la plus haute, elle ne couvre pas la barre des tâches.
3
Essayez: Bounds = Screen.PrimaryScreen.Bounds; codeproject.com/KB/cs/scrframework.aspx a plus de détails, comme pour multimon
Tron
1

Je ne sais pas si cela fonctionnera sur .NET 2.0, mais cela m'a fonctionné sur .NET 4.5.2. Voici le code:

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
}

Usage:

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

Remarque: vous DEVEZ le placer dans la classe de votre formulaire (Exemple:) partial class Form1 : Form { /* Code goes here */ }ou cela ne fonctionnera pas car si vous ne le placez sur aucun formulaire, le code thiscréera une exception.


la source
1

Sur l'événement de déplacement de formulaire, ajoutez ceci:

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);
}
Segan
la source
1

J'ai travaillé sur l'idée de Zingd et je l'ai simplifiée à utiliser.

J'ai également ajouté la touche F11 standard pour basculer en mode plein écran.

Installer

Tout est maintenant dans la classe FullScreen, vous n'avez donc pas à déclarer un tas de variables dans votre formulaire. Vous instanciez simplement un objet FullScreen dans le constructeur de votre formulaire:

FullScreen fullScreen;

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

Veuillez noter que cela suppose que le formulaire n'est pas agrandi lorsque vous créez l'objet FullScreen.

Usage

Il vous suffit d'utiliser l'une des fonctions de la classe pour basculer en mode plein écran:

fullScreen.Toggle();

ou si vous avez besoin de le gérer explicitement:

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

Code

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;
    }
}
Géraud Benazet
la source