在winform中,系统默认是不能够禁用窗体的关闭功能。但是有时候为了功能需要,需要对关闭按钮做一些处理,下面列举几种关闭按钮禁用(失效)的几种方法。
一.关闭按钮失效(两种方法):这时候关闭按钮正常显示,只是点击后不能关闭窗体,即按钮功能失效。
1.重载WndProc方法。示例代码如下:
protected override void WndProc(ref Message m)
{
const int WM_SYSCOMMAND = 0x0112;
const int SC_CLOSE = 0xF060;
if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE)
{
return;
}
base.WndProc(ref m);
}
2.利用窗体的FormClosing事件(需要注意的是:自定义关闭窗体时,需要首先将该事件移除,否则窗体永远关不掉。)示例代码如下:
FormClosing += new FormClosingEventHandler(Form_FormClosing);
private void Form_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
}
二.关闭按钮禁用(两种方法):这时候关闭按钮灰化,无法点击。
1.重载CreateParams属性,该属性功能很强大,可以参照msdn。
protected override CreateParams CreateParams
{
get
{
int CS_NOCLOSE = 0x200;
CreateParams parameters = base.CreateParams;
parameters.ClassStyle |= CS_NOCLOSE;
return parameters;
}
}
2.利用导入用户Dll方法,将标题栏按钮禁用。(需要引用System.Runtime.InteropServices命名空间)
[DllImport("USER32.DLL")]
public static extern int GetSystemMenu(int hwnd, int bRevert);
[DllImport("USER32.DLL")]
public static extern int EnableMenuItem(int hMenu, int nPosition, int wFlags);
const int MF_REMOVE = 0x1000;
const int SC_RESTORE = 0xF120; //还原
const int SC_MOVE = 0xF010; //移动
const int SC_SIZE = 0xF000; //大小
const int SC_MINIMIZE = 0xF020; //最小化
const int SC_MAXIMIZE = 0xF030; //最大化
const int SC_CLOSE = 0xF060; //关闭
private void Form_Load(object sender, EventArgs e)
{
int hMenu = GetSystemMenu(this.Handle.ToInt32(), 0);
EnableMenuItem(hMenu, SC_CLOSE, MF_REMOVE);
}
三.另外,可能还有很多需求是让关闭按钮隐藏掉,目前还没很好的办法,可能考虑设置窗体 FormBorderStyle 属性 为 None,彻底隐藏标题栏,然后自己在窗体顶部加一个Panel,模拟出来一个窗体标题栏,里面的内容可以根据需要来设置。