Bagaimana cara membuat aplikasi WinForms menjadi Layar Penuh

109

Saya memiliki aplikasi WinForms yang saya coba buat menjadi layar penuh (seperti yang dilakukan VS dalam mode layar penuh).

Saat ini saya menyetel FormBorderStyleke Nonedan WindowStateke Maximizedyang memberi saya sedikit lebih banyak ruang, tetapi tidak menutupi bilah tugas jika terlihat.

Apa yang harus saya lakukan untuk menggunakan ruang itu juga?

Untuk poin bonus, adakah yang dapat saya lakukan agar MenuStripsembunyikan otomatis saya juga menyerahkan ruang itu?

Divins Mathew
sumber

Jawaban:

150

Untuk pertanyaan dasar, berikut ini akan melakukan trik (menyembunyikan bilah tugas)

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

Tapi, yang menarik, jika Anda menukar dua baris terakhir itu, Taskbar tetap terlihat. Saya pikir urutan tindakan ini akan sulit dikendalikan dengan jendela properti.

Henk Holterman
sumber
4
Masalah pemesanan adalah mengapa itu tidak berhasil untuk saya sebelumnya. Saya sebenarnya mengatur properti dalam urutan itu, tetapi ketika formulir sudah dimaksimalkan, pengaturan perbatasan ke tidak ada tidak meluas untuk menutupi bilah tugas. Saya bekerja dengan "memulihkan" bentuk mengubah batas dan kemudian memaksimalkan.
3
Saya memilikinya dalam urutan yang benar dan tidak berhasil. Bilah tugas selalu terlihat dan aplikasinya tidak di bawahnya, hanya tersisa ruang kosong untuk bilah tugas di sana. (Win7)
Preza8
@ Preza8 - baca komentar Grady, periksa apakah itu berlaku untuk situasi Anda.
Henk Holterman
1
Maaf, saya sudah lama tidak online di sini dan saya lupa bagaimana saya melakukannya, tetapi saya ingat bahwa setelah mencoba beberapa perintah acak, perintah tersebut membantu.
Preza8
Catatan: Untuk beberapa alasan saya harus mengatur properti DAN memasukkan ini ke dalam kode
Joe Phillips
22

Solusi yang teruji dan sederhana

Saya telah mencari jawaban untuk pertanyaan ini di SO dan beberapa situs lain, tetapi satu memberikan jawaban sangat kompleks bagi saya dan beberapa jawaban lainnya tidak berfungsi dengan benar, jadi setelah banyak pengujian kode saya memecahkan teka-teki ini.

Catatan: Saya menggunakan Windows 8 dan bilah tugas saya tidak dalam mode sembunyikan otomatis.

Saya menemukan bahwa mengatur WindowState ke Normal sebelum melakukan modifikasi apa pun akan menghentikan kesalahan dengan bilah tugas yang tidak tercakup.

Kode

Saya membuat kelas ini yang memiliki dua metode, yang pertama masuk ke "mode layar penuh" dan yang kedua meninggalkan "mode layar penuh". Jadi, Anda hanya perlu membuat objek dari kelas ini dan meneruskan Formulir yang ingin Anda setel layar penuh sebagai argumen ke metode EnterFullScreenMode atau ke metode 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;
    }
}

Contoh penggunaan

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

Saya telah menempatkan jawaban yang sama ini pada pertanyaan lain yang saya tidak yakin apakah itu duplikat atau bukan dari pertanyaan ini. (Tautan ke pertanyaan lain: Bagaimana cara menampilkan Formulir Windows dalam layar penuh di atas bilah tugas? )

Zignd
sumber
2
Karena penasaran, mengapa Anda memiliki enum lengkap untuk menggambarkan kondisi benar / salah?
Nathan Ridley
2
Saya menulis ini sejak lama ketika saya hanya ingin menulis kode, tolong perhatikan kebodohan saya yang masih muda. Ini memang tidak masuk akal sama sekali dan saya seharusnya menggunakan tipe boolean saja.
Zignd
Ini berhasil untuk saya, dan saya harus mengatur targetForm.WindowState = FormWindowState.Normal;di awal meninggalkan layar penuh juga. Itu untuk menangani kasus di mana pengguna akan layar penuh dari jendela yang dimaksimalkan.
gneri
6

Dan untuk pertanyaan menustrip, coba set

MenuStrip1.Parent = Nothing

saat dalam mode layar penuh, itu akan menghilang.

Dan saat keluar dari mode layar penuh, setel ulang menustrip1.parentke formulir lagi dan menu akan normal kembali.

Stefan
sumber
5

Anda dapat menggunakan kode berikut agar sesuai dengan layar sistem Anda dan bilah tugas terlihat.

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

Tidak perlu menggunakan:

    this.TopMost = true;

Garis itu mengganggu alt+tabuntuk beralih ke aplikasi lain. ("TopMost" berarti jendela tetap di atas jendela lain, kecuali jika juga ditandai "TopMost".)

Raghavendra Devraj
sumber
4

Saya baru-baru ini membuat aplikasi Mediaplayer dan saya menggunakan panggilan API untuk memastikan bilah tugas disembunyikan saat program berjalan layar penuh dan kemudian memulihkan bilah tugas saat program tidak dalam layar penuh atau tidak memiliki fokus atau keluar.

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
sumber
6
Bagaimana jika dua program melakukan ini? Bagaimana jika program Anda macet sebelum mendapat kesempatan untuk menampilkan bilah tugas?
Tmdean
@Tmdean: Dalam kasus saya itu bukan masalah, program ini berjalan di mashines yang didedikasikan untuk menjalankan program saya hanya di layar di ruang tunggu.
Stefan
@Tmdean: Poin tentang jika dua program melakukan ini adalah valid, itu dapat mengacaukan segalanya jika tidak ditangani dengan benar.
Stefan
2

Anda perlu mengatur jendela Anda menjadi yang paling atas.

Tron
sumber
1
Tidak ada dadu. Bahkan jika saya mengatur jendela menjadi paling atas, itu tidak menutupi bilah tugas.
3
Coba: Bounds = Screen.PrimaryScreen.Bounds; codeproject.com/KB/cs/scrframework.aspx memiliki detail lebih lanjut, seperti untuk multimon
Tron
1

Saya tidak tahu apakah ini akan berfungsi pada .NET 2.0, tetapi berhasil pada .NET 4.5.2. Ini kodenya:

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
}

Pemakaian:

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

Perhatian: Anda HARUS menempatkannya di dalam kelas Formulir Anda (Contoh :) partial class Form1 : Form { /* Code goes here */ }atau itu tidak akan berfungsi karena jika Anda tidak meletakkannya di formulir apa pun, kode thisakan membuat pengecualian.


sumber
1

Pada Acara Pindah Formulir tambahkan ini:

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

Saya mengerjakan ide Zingd dan membuatnya lebih mudah digunakan.

Saya juga menambahkan tombol F11 standar untuk beralih mode layar penuh.

Mempersiapkan

Semuanya sekarang ada di kelas FullScreen, jadi Anda tidak perlu mendeklarasikan banyak variabel di Formulir Anda. Anda baru saja membuat objek FullScreen di konstruktor formulir Anda:

FullScreen fullScreen;

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

Harap dicatat ini mengasumsikan formulir tidak dimaksimalkan saat Anda membuat objek FullScreen.

Pemakaian

Anda cukup menggunakan salah satu fungsi kelas untuk beralih ke mode layar penuh:

fullScreen.Toggle();

atau jika Anda perlu menanganinya secara eksplisit:

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

Kode

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
sumber