请问下高手,有人知道我们在拦截到关机消息时,如果要做一些自己的操作。如果超过20秒如何让时间自动顺延,而不要出现“立即结束”窗口或不要出现20秒强制结束进程的操作吗?
protected override void WndProc(ref Message m) { const int WM_QUERYENDSESSION = 0x011; const int WM_ENDSESSION = 0x16; if (m.Msg == WM_QUERYENDSESSION) { var ret = MessageBox.Show("Yes or No ?", "Test", MessageBoxButtons.YesNo); return; } base.WndProc(ref m); }
以上代码在关机时,如果阻塞超过一定时间就会有立即结束的对话框,我觉得很不友好,能否屏蔽或延迟关机/或重启/或注销,而不要出现那个讨厌的窗口?
我现在有一个解决方案,但不太完美,就是拦截到EndSession消息,直接返回false,让系统不要关机,但要记住系统调用的是关机还是注销,等用户确认完毕后,手动调用关机或注销代码。但缺点是无法分清是关机还是重启命令,导致重启命令会被当作关机来对待。
http://jingyan.baidu.com/article/09ea3edecd51a0c0aede39b7.html
按照这个步骤,修改关机等待时间为一个你期望的时间即可,就不用拦截关机等待的消息了
这个我也早试过了,这个修改后并不能立即生效。我需要的是动态的值,而不一个死的固定的值,调成固定的值就没有意义了。
@沧海一杰:
你的本意不就是不想看到强制结束的窗口么,你改成一个无限大的关机等待时间,这个窗口不就永远不会出来了么,为什么还要去动态修改呢?
@狼Robot: 听起来好像是可以这样,操作系统原有功能就会被改变,感觉这样的用户体验有点不好。
@沧海一杰:
你的需求本身就已经违反了操作系统原有的设计了,呵呵
@狼Robot: 看看明天有没有更好的方法,明天结贴,大家别急哦
理论上好象可行但很难实践更难实现
可以用服务来实现。服务可以请求更长的时间,在开始、暂停、终止的时候。
关机会自动调用终止,你在终止里头不断调用请求更长时间就可以了。