Jak ustawić aplikację WinForms na pełny ekran

109

Mam aplikację WinForms, którą próbuję wyświetlić na pełnym ekranie (trochę tak, jak robi to VS w trybie pełnoekranowym).

Obecnie ustawiam się FormBorderStylena Nonei WindowStatedo Maximizedco daje mi trochę więcej miejsca, ale nie zakrywa paska zadań, jeśli jest widoczny.

Co muszę zrobić, aby wykorzystać również tę przestrzeń?

Jeśli chodzi o punkty bonusowe, czy jest coś, co mogę zrobić, aby moje MenuStripautoukrywanie również zrezygnowało z tego miejsca?

Divins Mathew
źródło

Odpowiedzi:

150

Co do podstawowego pytania, poniższe rozwiązanie załatwi sprawę (ukryje pasek zadań)

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

Ale, co ciekawe, jeśli zamienisz te dwie ostatnie linie, pasek zadań pozostanie widoczny. Myślę, że kolejność tych działań będzie trudna do kontrolowania w oknie właściwości.

Henk Holterman
źródło
4
Problem z zamówieniem polega na tym, że wcześniej nie działało to dla mnie. Właściwie ustawiałem właściwości w tej kolejności, ale kiedy formularz jest już zmaksymalizowany, ustawienie obramowania na none nie rozszerza się, aby zakryć pasek zadań. Obejrzałem „przywracanie” formy, zmieniając obramowanie, a następnie maksymalizując.
3
Mam to we właściwej kolejności i nie działa. Pasek zadań jest zawsze widoczny, a aplikacja nie znajduje się pod nim, po prostu pozostawiła wolne miejsce na pasku zadań. (Win7)
Preza8
@ Preza8 - przeczytaj komentarz Grady'ego, sprawdź, czy dotyczy to Twojej sytuacji.
Henk Holterman
1
Przepraszam, dawno nie byłem tutaj online i zapomniałem, jak to zrobiłem, ale pamiętam, że po kilku próbach losowej kolejności tych poleceń pomaga.
Preza8
Uwaga: z jakiegoś powodu musiałem ustawić właściwości ORAZ umieścić to w kodzie
Joe Phillips
22

Sprawdzone i proste rozwiązanie

Szukałem odpowiedzi na to pytanie w SO i kilku innych witrynach, ale jedna dała odpowiedź była dla mnie bardzo złożona, a inne odpowiedzi po prostu nie działają poprawnie, więc po wielu testach kodu rozwiązałem tę zagadkę.

Uwaga: używam systemu Windows 8 i mój pasek zadań nie jest w trybie automatycznego ukrywania.

Odkryłem, że ustawienie WindowState na Normal przed wykonaniem jakichkolwiek modyfikacji zatrzyma błąd z nie pokrytym paskiem zadań.

Kod

Stworzyłem tę klasę, która ma dwie metody, pierwsza wchodzi w „tryb pełnego ekranu”, a druga wychodzi z „trybu pełnego ekranu”. Wystarczy więc utworzyć obiekt tej klasy i przekazać Formularz, który chcesz ustawić na pełny ekran jako argument do metody EnterFullScreenMode lub do metody 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;
    }
}

Przykład użycia

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

Umieściłem tę samą odpowiedź na innym pytaniu, co do którego nie jestem pewien, czy jest to duplikat, czy nie. (Link do drugiego pytania: Jak wyświetlić formularz systemu Windows na pełnym ekranie u góry paska zadań? )

Zignd
źródło
2
Z ciekawości, dlaczego masz całe wyliczenie opisujące warunek prawda / fałsz?
Nathan Ridley
2
Napisałem to dawno temu, kiedy chciałem tylko pisać kod, proszę, pamiętaj o mojej młodej głupocie. To rzeczywiście nie ma żadnego sensu i powinienem był po prostu użyć typu boolowskiego.
Zignd
U mnie zadziałało i musiałem ustawić targetForm.WindowState = FormWindowState.Normal;na początku wyjście z pełnego ekranu. To służy do obsługi przypadku, gdy użytkownik przechodzi na pełny ekran ze zmaksymalizowanego okna.
gneri
6

A jeśli chodzi o pytanie menustrip, spróbuj ustawić

MenuStrip1.Parent = Nothing

w trybie pełnoekranowym powinien zniknąć.

Po wyjściu z trybu pełnoekranowego zresetuj ponownie menustrip1.parentdo formularza, a menu znów będzie normalne.

Stefan
źródło
5

Możesz użyć następującego kodu, aby dopasować się do ekranu systemu, a pasek zadań jest widoczny.

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

Nie ma potrzeby używania:

    this.TopMost = true;

Ta linia przeszkadza w alt+tabprzełączaniu się do innej aplikacji. („TopMost” oznacza, że ​​okno pozostaje nad innymi oknami, chyba że są one również oznaczone jako „TopMost”).

Raghavendra Devraj
źródło
4

Niedawno utworzyłem aplikację Mediaplayer i użyłem wywołań API, aby upewnić się, że pasek zadań był ukryty, gdy program działał na pełnym ekranie, a następnie przywrócił pasek zadań, gdy program nie był w trybie pełnoekranowym lub nie był aktywny lub został zamknięty.

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
źródło
6
A gdyby tak zrobiły dwa programy? Co się stanie, jeśli Twój program ulegnie awarii, zanim będzie miał szansę odkryć pasek zadań?
Tmdean
@Tmdean: W moim przypadku to nie był problem, ten program działał na maszynach, które były przeznaczone do uruchamiania tylko mojego programu na ekranach w poczekalniach.
Stefan
@Tmdean: Punkt dotyczący tego, że jeśli dwa programy to zrobiły, jest ważny, może to zepsuć, jeśli nie zostanie prawidłowo obsłużony.
Stefan
2

Musisz ustawić okno tak, aby było najwyżej.

tron
źródło
1
Nie ma kości. Nawet jeśli ustawię okno jako najwyższe, nie zakrywa paska zadań.
3
Spróbuj: Bounds = Screen.PrimaryScreen.Bounds; codeproject.com/KB/cs/scrframework.aspx zawiera więcej szczegółów, jak na przykład multimon
Tron
1

Nie wiem, czy zadziała na .NET 2.0, ale zadziałało mi na .NET 4.5.2. Oto kod:

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
}

Stosowanie:

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

Uwaga: MUSISZ umieścić go w klasie swojego Formularza (Przykład:) partial class Form1 : Form { /* Code goes here */ }lub nie zadziała, ponieważ jeśli nie umieścisz go w żadnym formularzu, kod thisutworzy wyjątek.


źródło
1

Do zdarzenia przenoszenia formularza dodaj to:

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
źródło
1

Pracowałem nad pomysłem Zingda i uprościłem go w użyciu.

Dodałem również standardowy klawisz F11 do przełączania trybu pełnoekranowego.

Ustawiać

Wszystko jest teraz w klasie FullScreen, więc nie musisz deklarować wielu zmiennych w swoim Form. Po prostu umieszczasz obiekt FullScreen w konstruktorze formularza:

FullScreen fullScreen;

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

Należy pamiętać, że przy założeniu, że formularz nie jest zmaksymalizowany podczas tworzenia obiektu FullScreen.

Stosowanie

Po prostu użyj jednej z funkcji classe, aby przełączyć tryb pełnoekranowy:

fullScreen.Toggle();

lub jeśli musisz to zrobić jawnie:

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

Kod

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
źródło