winform窗体全屏

时间:2023-02-13 10:02:04

bool fullscreen = false;
Rectangle rect = new Rectangle();
private void button4_Click(object sender, EventArgs e)
{
    fullscreen = !fullscreen;//循环。点一次全屏,再点还原。
    SetFullScreen(fullscreen, ref rect);
    if (fullscreen)
    {
        this.WindowState = FormWindowState.Maximized;//全屏
    }
    else
    {
        this.WindowState = FormWindowState.Normal;//还原
    }
}

/// <summary>
/// 设置全屏或这取消全屏
/// </summary>
/// <param name="fullscreen">true:全屏 false:恢复</param>
/// <param name="rectOld">设置的时候,此参数返回原始尺寸,恢复时用此参数设置恢复</param>
/// <returns>设置结果</returns>
public static bool SetFullScreen(bool fullscreen, ref Rectangle rectOld)
{
    int Hwnd = 0;
    Hwnd = FindWindow("Shell_TrayWnd", null);
    if (Hwnd == 0) return false;
    if (fullscreen)
    {
        ShowWindow(Hwnd, SW_HIDE);
        Rectangle rectFull = Screen.PrimaryScreen.Bounds;
        SystemParametersInfo(SPI_GETWORKAREA, 0, ref rectOld, SPIF_UPDATEINIFILE);//get
        SystemParametersInfo(SPI_SETWORKAREA, 0, ref rectFull, SPIF_UPDATEINIFILE);//set
    }
    else
    {
        ShowWindow(Hwnd, SW_SHOW);
        SystemParametersInfo(SPI_SETWORKAREA, 0, ref rectOld, SPIF_UPDATEINIFILE);
    }
    return true;
}

[DllImport("user32.dll", EntryPoint = "ShowWindow")]
public static extern int ShowWindow(int hwnd, int nCmdShow);
public const int SW_SHOW = 5; public const int SW_HIDE = 0;

[DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
private static extern int SystemParametersInfo(int uAction, int uParam, ref Rectangle lpvParam, int fuWinIni);
public const int SPIF_UPDATEINIFILE = 0x1;
public const int SPI_SETWORKAREA = 47;
public const int SPI_GETWORKAREA = 48;

[DllImport("user32.dll", EntryPoint = "FindWindow")]
private static extern int FindWindow(string lpClassName, string lpWindowName);

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

class WindowsFullScreenApi
    {
        [DllImport("user32.dll", EntryPoint = "GetSystemMetrics")]
        public static extern int GetSystemMetrics(int which);
 
        [DllImport("user32.dll")]
        public static extern void
            SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter,
                         int X, int Y, int width, int height, uint flags);
 
        private const int SM_CXSCREEN = 0;
        private const int SM_CYSCREEN = 1;
        private static IntPtr HWND_TOP = IntPtr.Zero;
        private const int SWP_SHOWWINDOW = 64; // 0x0040
 
        public static int ScreenX
        {
            get { return GetSystemMetrics(SM_CXSCREEN); }
        }
 
        public static int ScreenY
        {
            get { return GetSystemMetrics(SM_CYSCREEN); }
        }
 
        public static void SetWinFullScreen(IntPtr hwnd)
        {
            SetWindowPos(hwnd, HWND_TOP, 0, 0, ScreenX, ScreenY, SWP_SHOWWINDOW);
        }
    }

调用::全屏

FormBorderStyle = FormBorderStyle.None;
                WindowState = FormWindowState.Maximized;
                WindowsFullScreenApi.SetWinFullScreen(Handle);

调用::恢复

FormBorderStyle = FormBorderStyle.Sizable;
                WindowState = FormWindowState.Maximized;//自己控制恢复后是什么状态