【IT168技术文档】
首先,先介绍下如何屏蔽Winform的关闭按钮,就是在点关闭时,并不是直接关闭程序,而是提示是否真的关闭或者最小化。
前段时间要实现这个功能,所以就在网上搜罗了下。Winform的关闭操作其实是发一个关闭的消息。所以,要想不关闭窗口,只 要截获这个消息就可以了。
那么如何截获呢?
可以用WndProc来得到并处理Window系统注销或关闭的消息:
上面的方法就是点击关闭按钮后不退出程序,而是最小化。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) // 用户点击关闭按钮 { this.WindowState = FormWindowState.Minimized; // 最小化 return; } base.WndProc(ref m); // 调用基类的窗体事件 }
另外,也可以用Closeing事件,事件里的参数e有个Cancel,当e.Cancel=true的时候也会不关闭程序及系统(或注销)。
这个方法是满足了我的要求,但是我昨天又想用在另一个Winform程序的时候,把代码添加过去,并做了适当的修改:
这里我是先提示是否确定要退出程序,如果选是才真的退出,否则不做任何处理。我把最后的一条语句注释掉了。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) // 用户点击关闭按钮 { if (DialogResult.No == MessageBox.Show("确定退出?", "退出", MessageBoxButtons.YesNo)) { // 不关闭 return; } } //base.WndProc(ref m); // 调用基类的窗体事件 }
这时问题就出现了:出现了“创建窗口句柄时出错”的Win32Exception。
后来把baseWndProc(ref m)的注释取消掉,就行了。