一个winform程序里用到了notifyicon 。现在发现,系统关机是无法关闭了。到了这个程序就会卡住。
重载了WinProc函数。处理WM_QUERYENDSESSION消息。
protected override void WndProc(ref System.Windows.Forms.Message m)
{
switch(m.Msg)
{
//系统退出消息处理
case WM_QUERYENDSESSION:
Application.Exit();
break;
default:
break;
}
base.WndProc (ref m);
}
现在的情况是。关机时程序能够自己退出。但是还会卡住。后面的程序都不会自己关闭了。。好像是收不到WM_QUERYENDSESSION消息了。。
那位知道这是怎么回事?麻烦告诉一下。谢谢了

解决方案 »

  1.   

    WM_QUERYENDSESSION是询问程序是否需要关闭,你一定要有相应的反回值,参考一下下面的代码:
    protected override void WndProc(ref Message m)
    {
    if (m.Msg == 0x11)//WM_QUERYENDSESSION
    {
    m.Result = (IntPtr)0;//0不关闭程序;1关闭程序
    return;
    }
    else if (m.Msg == 0x16)//WM_ENDSESSION
    {
    }
    base.WndProc(ref m);
    }
      

  2.   

    在你的代码逻辑中当系统询问是否关闭的时候,你不管"3721"就把程序狠狠的给退出了:
    case WM_QUERYENDSESSION:
    Application.Exit();
    break;这是不应该的.你一定要响应系统的询问并返回系统一个答案才可以.
      

  3.   

    又来晚了;确实这样,前些天我也遇到了同样的问题;
    我在关闭里面判断ToClosed = true是否真的需要关闭C#
    protected override void WndProc(ref Message m)
    {
    //获取系统消息:系统级别关闭为17
    if ((m.Msg == 17))
    {
    //如果不处理,将会造成系统无法注销重启等操作!
    ToClosed = true;
    Application.Exit();
    }
    base.WndProc(m);
    }VB
        Protected Overrides Sub WndProc(ByRef m As Message)
            '获取系统消息:系统级别关闭为17
            If (m.Msg = 17) Then
                '如果不处理,将会造成系统无法注销重启等操作!
                ToClosed = True
                Application.Exit()
            End If
            MyBase.WndProc(m)
        End Sub===========================================================
    博客空间:http://blog.csdn.net/lovingkiss
    资源下载:http://download.csdn.net/user/lovingkiss
    Email:loving-kiss@163.com
    本人说明:<我的帖子我做主,结贴率保持100%>
    优惠接单开发,信誉保证,Q66840199(请注明业务/技术咨询) 
    ===========================================================