下面介绍三种禁用系统关闭功能的方法,这三种方法虽然达到的效果是一样的,但是,有时,在不同的项目需求下,三种方法各自可以达到不同的要求:
1:
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:
protected override CreateParams CreateParams
{
get
{
int CS_NOCLOSE = 0×200;
CreateParams parameters = base.CreateParams;
parameters.ClassStyle |= CS_NOCLOSE;
return parameters;
}
}
3:
using System.Runtime.InteropServices; //禁用关闭按钮需要引用这个
/***************************禁用关闭按钮需要***********************/
[DllImport("USER32.DLL")]
public static extern int GetSystemMenu(int hwnd, int bRevert);
[DllImport("USER32.DLL")]
public static extern int RemoveMenu(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);
RemoveMenu(hMenu, SC_CLOSE, MF_REMOVE);
/******************************************************************/
}
这两种方法都是很平常的方法,调用API函数,这种有时在利用第三方控件后,方法失效。那么,还是推荐第一种方法。