Как заставить приложение 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
Проблема с заказом в том, почему раньше у меня не работало. На самом деле я устанавливал свойства в этом порядке, но когда форма уже развернута, установка для границы значения none не расширяется, чтобы закрыть панель задач. Я работал, «восстанавливая» форму, меняя границу, а затем увеличивая ее.
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 09
У меня это сработало, и мне также пришлось установить 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, 03
@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

В событии перемещения формы добавьте это:

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 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;
    }
}
Жеро Беназе
источник