Wie mache ich eine WinForms-App zum Vollbildmodus?

109

Ich habe eine WinForms-App, die ich im Vollbildmodus erstellen möchte (ähnlich wie VS im Vollbildmodus).

Zur Zeit bin ich Einstellung FormBorderStylezu Noneund WindowStatezu Maximizeddem gibt mir ein wenig mehr Platz, aber es funktioniert nicht in der Taskleiste überdecken , wenn es sichtbar ist.

Was muss ich tun, um diesen Raum ebenfalls zu nutzen?

Kann ich für Bonuspunkte etwas tun, um mein MenuStripAutohide so zu gestalten, dass auch dieser Platz frei bleibt?

Divins Mathew
quelle

Antworten:

150

Bei der Basisfrage reicht Folgendes aus (Ausblenden der Taskleiste)

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

Interessanterweise bleibt die Taskleiste sichtbar, wenn Sie die letzten beiden Zeilen vertauschen. Ich denke, die Reihenfolge dieser Aktionen wird mit dem Eigenschaftenfenster schwer zu steuern sein.

Henk Holterman
quelle
4
Das Bestellproblem ist, warum es bei mir vorher nicht funktioniert hat. Ich habe die Eigenschaften tatsächlich in dieser Reihenfolge festgelegt, aber wenn das Formular bereits maximiert ist, wird das Setzen des Rahmens auf "Keine" nicht erweitert, um die Taskleiste abzudecken. Ich habe das Formular "wiederhergestellt", indem ich den Rand geändert und dann maximiert habe.
3
Ich habe es in der richtigen Reihenfolge und es funktioniert nicht. Die Taskleiste ist immer sichtbar und die App befindet sich nicht darunter. Sie hat dort nur freien Speicherplatz für die Taskleiste gelassen. (Win7)
Preza8
@ Preza8 - lies Gradys Kommentar und überprüfe, ob das für deine Situation gilt.
Henk Holterman
1
Es tut mir leid, ich war schon lange nicht mehr online und habe vergessen, wie ich es gemacht habe, aber ich erinnere mich, dass es nach einigem Versuch einer zufälligen Reihenfolge dieser Befehle hilft.
Preza8
Hinweis: Aus irgendeinem Grund musste ich die Eigenschaften festlegen UND dies in den Code einfügen
Joe Phillips
22

Eine getestete und einfache Lösung

Ich habe in SO und einigen anderen Websites nach einer Antwort auf diese Frage gesucht, aber eine Antwort war für mich sehr komplex und einige andere Antworten funktionieren einfach nicht richtig. Nach vielen Codetests habe ich dieses Rätsel gelöst.

Hinweis: Ich verwende Windows 8 und meine Taskleiste befindet sich nicht im automatischen Ausblendmodus.

Ich habe festgestellt, dass das Setzen des WindowState auf Normal vor dem Ausführen von Änderungen den Fehler mit der nicht abgedeckten Taskleiste stoppt.

Der Code

Ich habe diese Klasse mit zwei Methoden erstellt: Die erste wechselt in den "Vollbildmodus" und die zweite verlässt den "Vollbildmodus". Sie müssen also nur ein Objekt dieser Klasse erstellen und das Formular, das Sie als Argument für den Vollbildmodus festlegen möchten, an die EnterFullScreenMode-Methode oder an die LeaveFullScreenMode-Methode übergeben:

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

Anwendungsbeispiel

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

Ich habe dieselbe Antwort auf eine andere Frage gestellt, bei der ich nicht sicher bin, ob es sich um ein Duplikat handelt oder nicht. (Link zur anderen Frage: Wie wird ein Windows Form im Vollbildmodus über der Taskleiste angezeigt? )

Zignd
quelle
2
Warum haben Sie aus Neugier eine ganze Aufzählung, um einen wahren / falschen Zustand zu beschreiben?
Nathan Ridley
2
Ich habe das vor langer Zeit geschrieben, als ich nur nach Code suchte, bitte beachten Sie meine junge Dummheit. Es macht in der Tat überhaupt keinen Sinn und ich hätte einfach einen booleschen Typ verwenden sollen.
Zignd
Es hat bei mir funktioniert und ich musste zu targetForm.WindowState = FormWindowState.Normal;Beginn des Vollbildmodus auch einstellen . Dies für die Behandlung des Falls, in dem der Benutzer von einem maximierten Fenster aus im Vollbildmodus arbeitet.
Gneri
6

Und für die Menustrip-Frage versuchen Sie es

MenuStrip1.Parent = Nothing

Im Vollbildmodus sollte es dann verschwinden.

Wenn Sie den Vollbildmodus verlassen, setzen Sie das menustrip1.parentFormular erneut auf das Formular zurück, und der Menustrip ist wieder normal.

Stefan
quelle
5

Sie können den folgenden Code verwenden, um ihn an Ihren Systembildschirm anzupassen, und die Taskleiste ist sichtbar.

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

Keine Notwendigkeit zu verwenden:

    this.TopMost = true;

Diese Leitung stört alt+tabden Wechsel zu einer anderen Anwendung. ("TopMost" bedeutet, dass das Fenster über anderen Fenstern bleibt, es sei denn, sie sind auch mit "TopMost" gekennzeichnet.)

Raghavendra Devraj
quelle
4

Ich habe kürzlich eine Mediaplayer-Anwendung erstellt und API-Aufrufe verwendet, um sicherzustellen, dass die Taskleiste ausgeblendet war, als das Programm im Vollbildmodus ausgeführt wurde, und dann die Taskleiste wiederhergestellt, wenn das Programm nicht im Vollbildmodus war oder keinen Fokus hatte oder beendet wurde.

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
quelle
6
Was wäre, wenn zwei Programme dies tun würden? Was ist, wenn Ihr Programm abstürzt, bevor die Taskleiste ausgeblendet werden kann?
Tmdean
@Tmdean: In meinem Fall war es kein Problem, dieses Programm wurde auf Mashines ausgeführt, die nur mein Programm auf Bildschirmen in Wartezimmern ausführen sollten.
Stefan
@Tmdean: Der Punkt, ob zwei Programme dies getan haben, ist gültig, es könnte Dinge durcheinander bringen, wenn es nicht richtig gehandhabt wird.
Stefan
2

Sie müssen Ihr Fenster so einstellen, dass es ganz oben ist.

Tron
quelle
1
Kein Würfel. Selbst wenn ich das Fenster ganz oben einstelle, wird die Taskleiste nicht verdeckt.
3
Versuchen Sie: Bounds = Screen.PrimaryScreen.Bounds; codeproject.com/KB/cs/scrframework.aspx hat mehr Details, wie für multimon
Tron
1

Ich weiß nicht, ob es unter .NET 2.0 funktioniert, aber unter .NET 4.5.2. Hier ist der 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
}

Verwendung:

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

Hinweis: Sie MÜSSEN es in die Klasse Ihres Formulars partial class Form1 : Form { /* Code goes here */ }einfügen (Beispiel :), sonst funktioniert es nicht, da Code thiseine Ausnahme erzeugt, wenn Sie es nicht in ein Formular einfügen .


quelle
1

Fügen Sie im Formularverschiebungsereignis Folgendes hinzu:

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
quelle
1

Ich habe an der Zingd-Idee gearbeitet und die Verwendung vereinfacht .

Ich habe auch die Standardtaste F11 hinzugefügt, um den Vollbildmodus umzuschalten.

Konfiguration

Alles befindet sich jetzt in der FullScreen-Klasse, sodass Sie in Ihrem Formular keine Variablen mehr deklarieren müssen. Sie instanziieren einfach ein FullScreen-Objekt im Konstruktor Ihres Formulars:

FullScreen fullScreen;

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

Beachten Sie, dass dies davon ausgeht, dass das Formular beim Erstellen des FullScreen-Objekts nicht maximiert wird.

Verwendung

Sie verwenden nur eine der Funktionen der Klasse, um den Vollbildmodus umzuschalten:

fullScreen.Toggle();

oder wenn Sie explizit damit umgehen müssen:

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
quelle