WinFormsアプリをフルスクリーンにする方法


109

私はフルスクリーンにしようとしているWinFormsアプリを持っています(フルスクリーンモードでVSが行うことと少し似ています)。

現在、私は設定していますFormBorderStyleNoneしてWindowStateまでMaximized私にもう少しスペースを与えるが、それが表示されている場合には、タスクバーの上にカバーしていません。

そのスペースを使用するために何をする必要がありますか?

ボーナスポイントについては、MenuStrip自動非表示にしてそのスペースをあきらめるために何かできることはありますか?

回答:


150

基本的な質問に対して、次のトリックを実行します(タスクバーを非表示にします)

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

しかし、興味深いことに、最後の2行を入れ替えても、タスクバーは表示されたままです。これらのアクションのシーケンスをプロパティウィンドウで制御するのは難しいと思います。


4
注文の問題が、以前はうまくいかなかった理由です。実際にはこの順序でプロパティを設定していましたが、フォームが既に最大化されている場合、境界線をなしに設定してもタスクバーをカバーするように拡張されません。枠を変えてフォームを「復元」し、最大化することで回避しました。

3
私はそれを正しい順序で持っています、そしてそれは働きません。タスクバーは常に表示されており、アプリはその下にありません。タスクバーの空きスペースが残っているだけです。(Win7)
Preza8 2013

@ Preza8-Gradyのコメントを読んで、状況に当てはまるかどうか確認してください。
ヘンクホルターマン2013

1
申し訳ありませんが、ここで長い間オンラインになっておらず、どうすればいいのか忘れてしまいましたが、これらのコマンドをランダムに並べてみると効果があることを覚えています。
Preza8 2013

注:私は、プロパティを設定し、コードでこれを入れていたいくつかの理由
ジョー・フィリップス

22

テスト済みのシンプルなソリューション

私はSOや他のいくつかのサイトでこの質問に対する回答を探していましたが、1つは非常に複雑な回答を与え、他の回答は単に正しく機能しなかったため、多くのコードテストの後にこのパズルを解決しました。

注:Windows 8を使用していて、タスクバーが自動非表示モードになっていない。

変更を行う前にWindowStateをNormalに設定すると、カバーされていないタスクバーでエラーが停止することを発見しました。

コード

2つのメソッドを持つこのクラスを作成しました。最初のメソッドは「フルスクリーンモード」に入り、2番目のメソッドは「フルスクリーンモード」を離れます。したがって、このクラスのオブジェクトを作成し、フルスクリーンを設定するフォームを引数として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
好奇心から、真/偽の状態を説明するための列挙型がなぜあるのですか?
Nathan Ridley、2015年

2
私がコードを書くことだけを把握していたずっと前にこれを書いたので、私の若い愚かさを気にしてください。それは確かにまったく意味がなく、私は単純にブール型を使用するべきでした。
Zignd 2015年

それは私にとってはうまくいきました、そして私は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
2つのプログラムがこれを行った場合はどうなりますか?タスクバーを再表示する機会を得る前にプログラムがクラッシュした場合はどうなりますか?
Tmdean 2009

@Tmdean:私の場合は問題ありませんでした。このプログラムは、待合室の画面で自分のプログラムのみを実行するための専用のマシンで実行されていました。
ステファン

@Tmdean:2つのプログラムがこれを実行した場合のポイントは有効であり、正しく処理されない場合、混乱を招く可能性があります。
ステファン

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オブジェクトを作成するときにフォームが最大化されていないことを前提としています。

使用法

クラスの関数の1つを使用して、全画面モードを切り替えます。

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;
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.