• 屏蔽Winform的关闭按钮与“创建窗口句柄时出错” (转)


    原链接:http://www.cnblogs.com/adaiye/archive/2008/04/08/wndproc.html

    首先,先介绍下如何屏蔽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)的注释取消掉,就行了。   具体原因还不清楚,知道的朋友讲解下。
    希望,能给有类似困扰的朋友有所帮助。
  • 相关阅读:
    flex,flashDevelop和gumbo编译器比较
    用侦听器的useCapture属性决定事件哪个阶段做处理
    关于显示对象的parent,stage属性的说明
    ASP.NET MVC 1.0 Result 几何?
    MVC Controller与ActionResult的返回值
    C# 可空类型和空接合运算符(??)
    C# 2.0新特性与C# 3.5新特性
    创建返回Excel的自定义ActionResult
    jQuery getJSON()函数及getScript()函数
    如何使用ASP.NET MVC的Filter
  • 原文地址:https://www.cnblogs.com/glacier/p/1423691.html
Copyright © 2020-2023  润新知