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
}
窗体全屏
窗体全屏的方法:
隐藏任务栏、设置工作区域
窗体最大化、设置窗体边框样式