关于notifyicon的问题。解决问题马上给分
一个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消息了。。
那位知道这是怎么回事?麻烦告诉一下。谢谢了。。。
------解决方案--------------------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);
}
------解决方案--------------------在你的代码逻辑中当系统询问是否关闭的时候,你不管 "3721 "就把程序狠狠的给退出了:
case WM_QUERYENDSESSION:
Application.Exit();
break;
这是不应该的.
你一定要响应系统的询问并返回系统一个答案才可以.
------解决方案--------------------又来晚了;
确实这样,前些天我也遇到了同样的问题;
我在关闭里面判断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(请注明业务/技术咨询)
===========================================================