WinForms uygulamasının Tam Ekran olmasını nasıl sağlayabilirim


109

Tam ekran yapmaya çalıştığım bir WinForms uygulamam var (VS'nin tam ekran modunda yaptığı gibi).

Şu anda kuruyorum FormBorderStyleiçin Noneve WindowStateiçin Maximizedhangi bana biraz daha fazla yer verir, ancak görünür ise o vazife üzerinde kapsamaz.

O alanı kullanmak için ne yapmam gerekiyor?

Bonus puanlar için, MenuStripotomatik gizlememi o alandan vazgeçecek şekilde yapmak için yapabileceğim bir şey var mı?

Yanıtlar:


150

Temel soruya, aşağıdaki hile yapacak (görev çubuğunu gizleme)

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

Ancak ilginç bir şekilde, bu son iki satırı değiştirirseniz, Görev Çubuğu görünür kalır. Bu eylemlerin sırasını özellikler penceresi ile kontrol etmenin zor olacağını düşünüyorum.


4
Sipariş sorunu, daha önce benim için çalışmamasının nedeni. Aslında özellikleri bu sırayla ayarlıyordum, ancak form zaten büyütüldüğünde sınırı hiçbiri olarak ayarlamak görev çubuğunu kapsayacak şekilde genişlemiyor. Formu "geri yükleyerek" kenarlığı değiştirerek ve ardından maksimize ederek çalıştım.

3
Doğru sırayla aldım ve işe yaramıyor. Görev çubuğu her zaman görünür ve uygulama onun altında değil, sadece orada görev çubuğu için boş alan bıraktı. (Win7)
Preza8

@ Preza8 - Grady'nin yorumunu okuyun, bunun sizin durumunuz için geçerli olup olmadığını kontrol edin.
Henk Holterman

1
Üzgünüm, uzun süredir burada çevrimiçi değilim ve bunu nasıl yaptığımı unuttum, ancak bu komutların rastgele sırasını denedikten sonra yardımcı olduğunu hatırlıyorum.
Preza 8

Not: Bazı nedenlerden dolayı özellikleri ayarlamam VE bunu koda koymam
Joe Phillips

22

Test edilmiş ve basit bir çözüm

SO'da ve diğer bazı sitelerde bu soruya bir cevap arıyordum, ancak biri cevap verdiğim için çok karmaşıktı ve diğerleri cevaplar doğru çalışmıyor, bu yüzden çok sayıda kod testinden sonra bu bulmacayı çözdüm.

Not: Windows 8 kullanıyorum ve görev çubuğum otomatik gizleme modunda değil.

Herhangi bir değişiklik yapmadan önce WindowState'i Normal olarak ayarlamanın, kapsanmayan görev çubuğundaki hatayı durduracağını keşfettim.

Kod

İki yöntemi olan bu sınıfı oluşturdum, birincisi "tam ekran moduna" giriyor ve ikincisi "tam ekran modunu" terk ediyor. Bu nedenle, bu sınıfın bir nesnesini oluşturmanız ve tam ekranı bağımsız değişken olarak ayarlamak istediğiniz Formu EnterFullScreenMode yöntemine veya LeaveFullScreenMode yöntemine iletmeniz yeterlidir:

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

Kullanım örneği

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

Aynı yanıtı, bunun bir kopyası olup olmadığından emin olmadığım başka bir soruya da verdim. (Diğer soruya bağlantı: Bir Windows Formu görev çubuğunun üstünde tam ekranda nasıl görüntülenir? )


2
Meraktan, neden doğru / yanlış bir durumu tanımlayacak bütün bir enum var?
Nathan Ridley

2
Bunu uzun zaman önce sadece kod yazmayı düşünürken yazmıştım, lütfen genç aptallığıma dikkat edin. Aslında hiçbir anlam ifade etmiyor ve basitçe bir boole türü kullanmalıydım.
Zignd

Benim için çalıştı ve ben de targetForm.WindowState = FormWindowState.Normal;tam ekrandan çıkmanın başlangıcını ayarlamak zorunda kaldım . Bu, kullanıcının büyütülmüş bir pencereden tam ekrana geçeceği durumu ele almak için.
gneri

6

Ve menü sorusu için seti deneyin

MenuStrip1.Parent = Nothing

tam ekran modundayken kaybolması gerekir.

Ve tam ekran menustrip1.parentmodundan çıkarken , forma yeniden sıfırlayın ve menü çubuğu tekrar normal hale gelecektir.


5

Sistem ekranınıza sığması için aşağıdaki kodu kullanabilirsiniz ve görev çubuğu görünür.

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

Kullanmaya gerek yok:

    this.TopMost = true;

Bu hat alt+tab, başka bir uygulamaya geçmeyi engelliyor. ("En Üst", pencerenin, "En Üst" olarak işaretlenmedikçe diğer pencerelerin üzerinde kalacağı anlamına gelir.)


4

Kısa süre önce bir Mediaplayer uygulaması yaptım ve program tam ekran çalışırken görev çubuğunun gizlendiğinden emin olmak için API çağrılarını kullandım ve ardından program tam ekranda olmadığında veya odak olmadığında veya çıkıldığında görev çubuğunu geri yükledim.

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
Ya bunu iki program yaptıysa? Görev çubuğunu gösterme şansı bulamadan programınız çökerse ne olur?
Tmdean

@Tmdean: Benim durumumda sorun olmadı, bu program bekleme odalarındaki ekranlarda yalnızca programımı çalıştırmaya adanmış makinelerde çalışıyordu.
Stefan

@Tmdean: İki programın bunu yapıp yapmadığı ile ilgili nokta, doğru şekilde ele alınmazsa işleri karıştırabilir.
Stefan


1

.NET 2.0 üzerinde çalışıp çalışmayacağını bilmiyorum ama .NET 4.5.2'de işe yaradı. İşte 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
}

Kullanım:

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

Uyarı: Bunu Formunuzun sınıfının (Örnek:) içine yerleştirmeniz GEREKİR partial class Form1 : Form { /* Code goes here */ }, aksi takdirde çalışmaz çünkü herhangi bir forma yerleştirmezseniz, kod thisbir istisna oluşturur.


1

Form Taşıma Etkinliğinde şunu ekleyin:

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 fikri üzerinde çalıştım ve kullanımını kolaylaştırdım .

Tam ekran moduna geçmek için standart F11 tuşunu da ekledim .

Kurmak

Artık her şey FullScreen sınıfındadır, bu nedenle Formunuzda bir grup değişkeni bildirmeniz gerekmez. Formunuzun yapıcısında bir FullScreen nesnesi oluşturursunuz:

FullScreen fullScreen;

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

Lütfen bunun, FullScreen nesnesini oluşturduğunuzda formun büyütülmediğini varsaydığını unutmayın.

Kullanım

Tam ekran modunu değiştirmek için sınıfın işlevlerinden birini kullanırsınız:

fullScreen.Toggle();

veya açıkça işlemeniz gerekiyorsa:

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;
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.