Làm cách nào để tạo ứng dụng WinForms ở chế độ Toàn màn hình


109

Tôi có một ứng dụng WinForms mà tôi đang cố gắng tạo toàn màn hình (hơi giống những gì VS làm ở chế độ toàn màn hình).

Hiện nay tôi đang thiết FormBorderStyleđể NoneWindowStateđể Maximizedmang đến cho tôi một không gian hơn chút, nhưng nó không bao gồm các mục trên taskbar nếu nó là nhìn thấy được.

Tôi cần làm gì để sử dụng cả không gian đó?

Đối với điểm thưởng, tôi có thể làm gì để tính năng MenuStriptự động ẩn của mình từ bỏ không gian đó không?

Câu trả lời:


150

Đối với câu hỏi cơ bản, phần sau sẽ thực hiện thủ thuật (ẩn thanh tác vụ)

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

Tuy nhiên, thật thú vị, nếu bạn hoán đổi hai dòng cuối cùng, Thanh tác vụ vẫn hiển thị. Tôi nghĩ rằng chuỗi các hành động này sẽ khó kiểm soát với cửa sổ thuộc tính.


4
Vấn đề đặt hàng là tại sao nó không hoạt động với tôi trước đây. Tôi thực sự đã đặt các thuộc tính theo thứ tự đó, nhưng khi biểu mẫu đã được tối đa hóa, việc đặt đường viền thành không có sẽ không mở rộng để che thanh tác vụ. Tôi đã làm việc xung quanh bằng cách "khôi phục" biểu mẫu thay đổi đường viền và sau đó tối đa hóa.

3
Tôi có nó theo đúng thứ tự và nó không hoạt động. Thanh tác vụ luôn hiển thị và ứng dụng không ở bên dưới, nó chỉ để lại phần trống miễn phí cho thanh tác vụ ở đó. (Win7)
Preza8,

@ Preza8 - đọc bình luận của Grady, kiểm tra xem điều đó có phù hợp với tình huống của bạn không.
Henk Holterman

1
Tôi xin lỗi, tôi đã không trực tuyến ở đây trong một thời gian dài và tôi quên cách tôi đã làm điều đó nhưng tôi nhớ rằng sau một số lần thử thứ tự ngẫu nhiên của các lệnh đó sẽ giúp ích.
Preza8

Lưu ý: Vì một số lý do, tôi phải đặt các thuộc tính VÀ đưa điều này vào mã
Joe Phillips

22

Một giải pháp đã được thử nghiệm và đơn giản

Tôi đã tìm kiếm câu trả lời cho câu hỏi này trong SO và một số trang web khác, nhưng một người đưa ra một câu trả lời rất phức tạp đối với tôi và một số câu trả lời khác chỉ đơn giản là không hoạt động chính xác, vì vậy sau nhiều lần kiểm tra mã, tôi đã giải được câu đố này.

Lưu ý: Tôi đang sử dụng Windows 8 và thanh tác vụ của tôi không ở chế độ tự động ẩn.

Tôi phát hiện ra rằng việc đặt WindowState thành Bình thường trước khi thực hiện bất kỳ sửa đổi nào sẽ ngăn lỗi với thanh tác vụ không được che phủ.

Mật mã

Tôi đã tạo lớp này có hai phương thức, phương thức đầu tiên đi vào "chế độ toàn màn hình" và phương thức thứ hai rời khỏi "chế độ toàn màn hình". Vì vậy, bạn chỉ cần tạo một đối tượng của lớp này và chuyển Biểu mẫu bạn muốn đặt toàn màn hình làm đối số cho phương thức EnterFullScreenMode hoặc phương thức 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;
    }
}

Ví dụ sử dụng

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

Tôi đã đặt câu trả lời tương tự này cho một câu hỏi khác mà tôi không chắc liệu có trùng lặp hay không của câu hỏi này. (Liên kết đến câu hỏi khác: Làm thế nào để hiển thị Biểu mẫu Windows toàn màn hình trên đầu thanh tác vụ? )


2
Vì tò mò, tại sao bạn có toàn bộ enum để mô tả một điều kiện đúng / sai?
Nathan Ridley

2
Tôi đã viết bài này cách đây khá lâu khi tôi chỉ mới nắm bắt để viết mã, xin hãy nhớ đến sự ngu ngốc trẻ tuổi của tôi. Nó thực sự không có ý nghĩa gì cả và tôi lẽ ra chỉ nên sử dụng một kiểu boolean.
Zignd

Nó hiệu quả với tôi, và tôi cũng phải đặt targetForm.WindowState = FormWindowState.Normal;ở đầu để rời khỏi chế độ toàn màn hình. Điều đó để xử lý trường hợp người dùng ở chế độ toàn màn hình từ cửa sổ được phóng to.
gneri

6

Và đối với câu hỏi về menustrip, hãy thử đặt

MenuStrip1.Parent = Nothing

khi ở chế độ toàn màn hình, nó sẽ hiển thị.

Và khi thoát ra chế độ toàn màn hình, hãy đặt lại menustrip1.parentbiểu mẫu một lần nữa và menustrip sẽ bình thường trở lại.


5

Bạn có thể sử dụng mã sau để phù hợp với màn hình hệ thống của bạn và thanh tác vụ hiển thị.

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

Không cần sử dụng:

    this.TopMost = true;

Dòng đó cản trở alt+tabđể chuyển sang ứng dụng khác. ("TopMost" có nghĩa là cửa sổ nằm trên các cửa sổ khác, trừ khi chúng cũng được đánh dấu là "TopMost".)


4

Gần đây, tôi đã tạo một ứng dụng Mediaplayer và tôi đã sử dụng lệnh gọi API để đảm bảo thanh tác vụ bị ẩn khi chương trình đang chạy toàn màn hình và sau đó khôi phục thanh tác vụ khi chương trình không ở chế độ toàn màn hình hoặc không có tiêu điểm hoặc đã thoát.

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
Điều gì sẽ xảy ra nếu hai chương trình đã làm điều này? Điều gì sẽ xảy ra nếu chương trình của bạn gặp sự cố trước khi nó có cơ hội hiển thị thanh tác vụ?
Tmdean

@Tmdean: Trong trường hợp của tôi, đó không phải là vấn đề, chương trình này đang chạy trên mashines được dành riêng để chạy chương trình của tôi trên màn hình trong phòng chờ.
Stefan

@Tmdean: Vấn đề là nếu hai chương trình làm điều này hợp lệ, nó có thể làm rối tung mọi thứ nếu không được xử lý đúng cách.
Stefan

2

Bạn cần đặt cửa sổ của mình ở trên cùng.


1
Không có con xúc xắc. Ngay cả khi tôi đặt cửa sổ ở trên cùng, nó vẫn không che thanh tác vụ.

3
Hãy thử: Bounds = Screen.PrimaryScreen.Bounds; codeproject.com/KB/cs/scrframework.aspx có nhiều chi tiết hơn, như cho multimon
Tron

1

Tôi không biết liệu nó có hoạt động trên .NET 2.0 hay không, nhưng nó đã hoạt động với tôi trên .NET 4.5.2. Đây là mã:

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
}

Sử dụng:

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

Lưu ý: Bạn PHẢI đặt nó bên trong lớp của Biểu mẫu (Ví dụ partial class Form1 : Form { /* Code goes here */ }:), nếu không nó sẽ không hoạt động vì nếu bạn không đặt nó trên bất kỳ biểu mẫu nào, mã thissẽ tạo ra một ngoại lệ.


1

Trên Sự kiện Di chuyển Biểu mẫu, hãy thêm cái này:

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

Tôi đã làm việc trên Zingd ý tưởng và làm cho nó đơn giản hơn để sử dụng.

Tôi cũng đã thêm phím F11 tiêu chuẩn để chuyển đổi chế độ toàn màn hình.

Thiết lập

Mọi thứ hiện ở trong lớp FullScreen, vì vậy bạn không phải khai báo một loạt các biến trong Biểu mẫu của mình. Bạn chỉ cần cài đặt một đối tượng FullScreen trong phương thức khởi tạo của biểu mẫu:

FullScreen fullScreen;

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

Xin lưu ý rằng điều này giả định rằng biểu mẫu không được tối đa hóa khi bạn tạo đối tượng FullScreen.

Sử dụng

Bạn chỉ cần sử dụng một trong các chức năng của classe để chuyển sang chế độ toàn màn hình:

fullScreen.Toggle();

hoặc nếu bạn cần xử lý nó một cách rõ ràng:

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;
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.