C#窗体全屏功能实例代码
最近有朋友让我给他弄个应用程序全屏的功能,例如银行的取号程序界面。所以我从网上查询了一些实现的方法。
C#应用程序中如何实现全屏幕显示功能?
效果就像windows自带的屏幕保护程序和众多的游戏那样,无论是否设置了“将任务栏保持在其他窗口的前端”都不显示任务栏
实现方式一
在网上找来一些简单的实现方式:
this.FormBorderStyle=FormBorderStyle.None;//设置窗体为无边框样式 this.WindowState=FormWindowState.Maximized;//最大化窗体
然后再设置窗体的位置和大小,例如:Width=1024Height=768Left=0Top=0等size的值
把以上两句代码直接放到Form1_Load的方法中,就可以了,比较简单,我就不贴代码了。
实现方式二
调用系统的API函数,如user32.dll中的FindWindow和ShowWindow函数,具体代码如下:
[DllImport("user32.dll",EntryPoint="ShowWindow")] publicstaticexternInt32ShowWindow(Int32hwnd,Int32nCmdShow); [DllImport("user32.dll",EntryPoint="FindWindow")] privatestaticexternInt32FindWindow(stringlpClassName,stringlpWindowName);
代码如下:
usingSystem; usingSystem.Windows.Forms; usingSystem.Drawing; usingSystem.Runtime.InteropServices; namespaceFullScr { publicpartialclassForm1:Form { Booleanm_IsFullScreen=false;//标记是否全屏 publicForm1() { InitializeComponent(); } privatevoidForm1_Load(objectsender,EventArgse) { } ///<summary> ///全屏按钮的Click事件 ///</summary> ///<paramname="sender"></param> ///<paramname="e"></param> privatevoidbutton1_Click(objectsender,EventArgse) { m_IsFullScreen=!m_IsFullScreen;//点一次全屏,再点还原。 this.SuspendLayout(); if(m_IsFullScreen)//全屏,按特定的顺序执行 { SetFormFullScreen(m_IsFullScreen); this.FormBorderStyle=FormBorderStyle.None; this.WindowState=FormWindowState.Maximized; this.Activate();// } else//还原,按特定的顺序执行——窗体状态,窗体边框,设置任务栏和工作区域 { this.WindowState=FormWindowState.Normal; this.FormBorderStyle=FormBorderStyle.Sizable; SetFormFullScreen(m_IsFullScreen); this.Activate(); } this.ResumeLayout(false); } ///<summary> ///设置全屏或这取消全屏 ///</summary> ///<paramname="fullscreen">true:全屏false:恢复</param> ///<paramname="rectOld">设置的时候,此参数返回原始尺寸,恢复时用此参数设置恢复</param> ///<returns>设置结果</returns> publicBooleanSetFormFullScreen(Booleanfullscreen)//,refRectanglerectOld { RectanglerectOld=Rectangle.Empty; Int32hwnd=0; hwnd=FindWindow("Shell_TrayWnd",null);//获取任务栏的句柄 if(hwnd==0)returnfalse; if(fullscreen)//全屏 { ShowWindow(hwnd,SW_HIDE);//隐藏任务栏 SystemParametersInfo(SPI_GETWORKAREA,0,refrectOld,SPIF_UPDATEINIFILE);//get屏幕范围 RectanglerectFull=Screen.PrimaryScreen.Bounds;//全屏范围 SystemParametersInfo(SPI_SETWORKAREA,0,refrectFull,SPIF_UPDATEINIFILE);//窗体全屏幕显示 } else//还原 { ShowWindow(hwnd,SW_SHOW);//显示任务栏 SystemParametersInfo(SPI_SETWORKAREA,0,refrectOld,SPIF_UPDATEINIFILE);//窗体还原 } returntrue; } #regionuser32.dll publicconstInt32SPIF_UPDATEINIFILE=0x1; publicconstInt32SPI_SETWORKAREA=47; publicconstInt32SPI_GETWORKAREA=48; publicconstInt32SW_SHOW=5; publicconstInt32SW_HIDE=0; [DllImport("user32.dll",EntryPoint="ShowWindow")] publicstaticexternInt32ShowWindow(Int32hwnd,Int32nCmdShow); [DllImport("user32.dll",EntryPoint="FindWindow")] privatestaticexternInt32FindWindow(stringlpClassName,stringlpWindowName); [DllImport("user32.dll",EntryPoint="SystemParametersInfo")] privatestaticexternInt32SystemParametersInfo(Int32uAction,Int32uParam,refRectanglelpvParam,Int32fuWinIni); #endregion } }
完善后的代码:
非常感谢@iheartwater的热心帮助,更改后的代码能够解决”全屏后,窗体能够恢复到原来的状态,包括位置(Loaction)和大小(Size)“,唉,其实,原因还挺简单的。
ModifiedCode publicpartialclassFrmFullScreen:Form { Booleanm_IsFullScreen=false;//标记是否全屏 publicFrmFullScreen() { InitializeComponent(); } ///<summary> ///全屏按钮的Click事件 ///</summary> ///<paramname="sender"></param> ///<paramname="e"></param> privatevoidbtnFullScreen_Click(objectsender,EventArgse) { m_IsFullScreen=!m_IsFullScreen;//点一次全屏,再点还原。 this.SuspendLayout(); if(m_IsFullScreen)//全屏,按特定的顺序执行 { SetFormFullScreen(m_IsFullScreen); this.FormBorderStyle=FormBorderStyle.None; this.WindowState=FormWindowState.Maximized; this.Activate();// } else//还原,按特定的顺序执行——窗体状态,窗体边框,设置任务栏和工作区域 { this.WindowState=FormWindowState.Normal; this.FormBorderStyle=FormBorderStyle.Sizable; SetFormFullScreen(m_IsFullScreen); this.Activate(); } this.ResumeLayout(false); } ///<summary> ///全屏的快捷功能,F11相当于单机按钮;Esc健,如果全屏则退出全屏 ///</summary> ///<paramname="sender"></param> ///<paramname="e"></param> privatevoidbtnFullScreen_KeyDown(objectsender,KeyEventArgse) { if(e.KeyCode==Keys.F11) { btnFullScreen.PerformClick(); e.Handled=true; } elseif(e.KeyCode==Keys.Escape)//esc键盘退出全屏 { if(m_IsFullScreen) { e.Handled=true; this.WindowState=FormWindowState.Normal;//还原 this.FormBorderStyle=FormBorderStyle.Sizable; SetFormFullScreen(false); } } } ///<summary> ///设置全屏或这取消全屏 ///</summary> ///<paramname="fullscreen">true:全屏false:恢复</param> ///<paramname="rectOld">设置的时候,此参数返回原始尺寸,恢复时用此参数设置恢复</param> ///<returns>设置结果</returns> publicBooleanSetFormFullScreen(Booleanfullscreen)//,refRectanglerectOld { RectanglerectOld=Rectangle.Empty; Int32hwnd=0; hwnd=FindWindow("Shell_TrayWnd",null);//获取任务栏的句柄 if(hwnd==0)returnfalse; if(fullscreen)//全屏 { ShowWindow(hwnd,SW_HIDE);//隐藏任务栏 SystemParametersInfo(SPI_GETWORKAREA,0,refrectOld,SPIF_UPDATEINIFILE);//get屏幕范围 RectanglerectFull=Screen.PrimaryScreen.Bounds;//全屏范围 SystemParametersInfo(SPI_SETWORKAREA,0,refrectFull,SPIF_UPDATEINIFILE);//窗体全屏幕显示 } else//还原 { ShowWindow(hwnd,SW_SHOW);//显示任务栏 SystemParametersInfo(SPI_SETWORKAREA,0,refrectOld,SPIF_UPDATEINIFILE);//窗体还原 } returntrue; } #regionuser32.dll [DllImport("user32.dll",EntryPoint="ShowWindow")] publicstaticexternInt32ShowWindow(Int32hwnd,Int32nCmdShow); publicconstInt32SW_SHOW=5;publicconstInt32SW_HIDE=0; [DllImport("user32.dll",EntryPoint="SystemParametersInfo")] privatestaticexternInt32SystemParametersInfo(Int32uAction,Int32uParam,refRectanglelpvParam,Int32fuWinIni); publicconstInt32SPIF_UPDATEINIFILE=0x1; publicconstInt32SPI_SETWORKAREA=47; publicconstInt32SPI_GETWORKAREA=48; [DllImport("user32.dll",EntryPoint="FindWindow")] privatestaticexternInt32FindWindow(stringlpClassName,stringlpWindowName); #endregion }
窗体全屏
窗体全屏的方法:
隐藏任务栏、设置工作区域
窗体最大化、设置窗体边框样式