Як зробити так, щоб програма WinForms перейшла на весь екран


109

У мене є додаток WinForms, який я намагаюся зробити на повний екран (дещо схоже на те, що VS робить у повноекранному режимі).

В даний час я встановлюю FormBorderStyleв Noneі WindowStateдо , Maximizedщо дає мені трохи більше простору, але це не поширюється через панель задач , якщо вона видна.

Що мені потрібно зробити, щоб використовувати і цей простір?

Що стосується бонусних балів, чи можу я щось зробити, щоб змусити себе також MenuStripавтохрону відмовитись від цього місця?

Відповіді:


150

До базового питання наступне буде робити хитрість (приховуючи панель завдань)

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

Але що цікаво, якщо поміняти ці два останні рядки, панель завдань залишається видимою. Я думаю, що послідовність цих дій буде важко контролювати за допомогою вікна властивостей.


4
Питання замовлення, чому раніше не працювало для мене. Я фактично встановлював властивості в тому порядку, але коли форма вже максимізована, встановлення межі до жодної не розширюється, щоб охопити панель завдань. Я працював навколо того, щоб "відновити" форму, змінивши кордон, а потім максимізувавши.

3
У мене це в правильному порядку, і він не працює. Панель завдань завжди видно, і додаток не знаходиться під нею, вона просто залишила там вільний доступ до панелі завдань. (Win7)
Preza8

@ Preza8 - прочитайте коментар Грейді, перевірте, чи це стосується вашої ситуації.
Хенк Холтерман

1
Вибачте, я давно не був у мережі, і я забув, як це зробив, але пам'ятаю, що після деяких спроб випадкового порядку цих команд допомагає.
Preza8

Примітка: Чомусь мені довелося встановити властивості І ввести це в код
Джо Філіпс

22

Перевірене і просте рішення

Я шукав відповідь на це питання в SO та деяких інших сайтах, але один дав відповідь дуже складний для мене, а деякі інші відповіді просто не працюють правильно, тому після багато тестування коду я вирішив цю головоломку.

Примітка. Я використовую Windows 8, і моя панель завдань не перебуває в режимі автоматичного приховування.

Я виявив, що встановлення WindowState на Normal перед виконанням будь-яких модифікацій зупинить помилку на незакритій панелі завдань.

Код

Я створив цей клас із двома методами, перший входить у «режим повного екрану», а другий залишає «режим повного екрану». Тож вам просто потрібно створити об’єкт цього класу та передати форму, яку ви хочете встановити на весь екран, як аргумент методу EnterFullScreenMode або методу 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;
    }
}

Приклад використання

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

Цю саму відповідь я розмістив на іншому запитанні, в якому я не впевнений, дублікат це чи ні. (Посилання на інше питання: Як відобразити Форму Windows у повноекранному режимі вгорі панелі завдань? )


2
З цікавості, чому у вас є цілий перелік, щоб описати справжній / хибний стан?
Натан Рідлі

2
Я писав це дуже давно, коли мені лише доводилося писати код, будь ласка, зауважте мою молоду німоту. Це взагалі не має сенсу, і я повинен був просто використовувати булівський тип.
Zignd

Це працювало для мене, і мені довелося налаштувати targetForm.WindowState = FormWindowState.Normal;на початку виходу з повного екрану. Це для обробки випадку, коли користувач переходить на весь екран із максимального вікна.
gneri

6

А для меню-запитання спробуйте встановити

MenuStrip1.Parent = Nothing

коли в режимі повноекранного режиму він повинен не працювати.

А при виході з повноекранного menustrip1.parentрежиму знову поверніть форму до форми, і меню знову буде нормальним.


5

Ви можете використовувати наступний код, щоб відповідати екрану вашої системи, а панель завдань видно.

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

Не потрібно використовувати:

    this.TopMost = true;

Ця лінія заважає alt+tabперейти на іншу програму. ("TopMost" означає, що вікно залишається поверх інших вікон, якщо вони також не позначені "TopMost".)


4

Нещодавно я зробив програму Mediaplayer, і я використовував API-дзвінки, щоб переконатися, що панель завдань прихована під час запуску програми на повноекранному екрані, а потім відновила панель завдань, коли програма не була на повноекранному екрані або не мала уваги або не була закрита.

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
Що робити, якщо це зробили дві програми? Що робити, якщо ваша програма вийде з ладу, перш ніж вона отримає шанс розгорнути панель завдань?
Tmdean

@Tmdean: У моєму випадку це не було проблемою, ця програма працювала на машинах, призначених для запуску лише моєї програми на екранах у залах очікування.
Стефан

@Tmdean: Справа в тому, що якщо дві програми зробили це дійсно, це може зіпсувати речі, якщо не оброблятися правильно.
Стефан

2

Потрібно встановити вікно, щоб воно було найвищим.


1
Без кісток. Навіть якщо я встановив вікно найкращим, воно не приховує панель завдань.

3
Спробуйте: Bounds = Screen.PrimaryScreen.Bounds; codeproject.com/KB/cs/scrframework.aspx має більше деталей, як для multimon
Tron

1

Я не знаю, чи буде він працювати на .NET 2.0, але він працював на .NET 4.5.2. Ось код:

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
}

Використання:

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

Зауважте: ОБОВ'ЯЗКОВО розмістити його у класі своєї форми (Приклад:), partial class Form1 : Form { /* Code goes here */ }інакше він не працюватиме, тому що якщо ви не розмістите його в будь-якій формі, код thisстворить виняток.


1

До події Form Move додайте це:

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

Я працював над ідеєю Zingd і спростив її у використанні.

Я також додав стандартну клавішу F11, щоб переключити режим повноекранного режиму.

Налаштування

Тепер все в повноекранному класі, тому вам не потрібно декларувати купу змінних у вашій формі. Ви просто заповнити об'єкт FullScreen у конструкторі форми:

FullScreen fullScreen;

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

Зауважте, це передбачає, що форма не збільшується під час створення об’єкта FullScreen.

Використання

Ви просто використовуєте одну з функцій класу, щоб увімкнути режим повноекранного режиму:

fullScreen.Toggle();

або якщо вам потрібно попрацювати з цим явно:

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

Код

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;
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.