主题:[讨论]如何保证自己的程序第一个获得关机时的消息?
天天学习
[专家分:4570] 发布于 2008-12-23 17:44:00
今天翻看以前写的代码时,发现一个通过拦截wm_QueryEndSession和wm_endSession来实现的阻止关机的小程序。
虽然最终能够阻止关机,但是一些程序由于比本程序先得到wm_queryEndSession和wm_endsession消息,还是被关闭了。(个人理解)。
有没有方法让自己的程序第一个获得关机时的消息,然后“吃”掉它,不再往下传给其它程序???
回复列表 (共4个回复)
沙发
tanchuhan [专家分:15140] 发布于 2008-12-23 18:34:00
在窗体的事件可以拦截到的:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
'
End Sub
UnloadMode就是关闭原因(有任务管理器关你,或者用户点了右上角等等),我没有MSDN6,具体你自己查下。msdn2008没有这个东西
Cancel = True 拦截
当然,VB也是通过处理消息来生成这个事件的。
第一个接收到我估计没办法,这些应该由操作系统来管理。
不过有时取消不到关机运作是因为关机时加了个EWX_FORCE,所以不管你的进程同不同意他也照样关。(并不是被吃掉了,而是根本就不通知你)
EWX_FORCE
0x00000004
This flag has no effect if terminal services is enabled. Otherwise, the system does not send the WM_QUERYENDSESSION and WM_ENDSESSION messages. This can cause applications to lose data. Therefore, you should only use this flag in an emergency.
板凳
tanchuhan [专家分:15140] 发布于 2008-12-23 18:44:00
刚下载了一个msdn for vb6精简版回来:
unloadmode 参数返回下列值:
常数 值 描述
vbFormControlMenu 0 用户从窗体上的“控件”菜单中选择“关闭”指令。
vbFormCode 1 Unload 语句被代码调用。
vbAppWindows 2 当前 Microsoft Windows 操作环境会话结束。
vbAppTaskManager 3 Microsoft Windows 任务管理器正在关闭应用程序。
vbFormMDIForm 4 MDI 子窗体正在关闭,因为 MDI 窗体正在关闭。
vbFormOwner 5 因为窗体的所有者正在关闭,所以窗体也在关闭。
关机的话我估计是vbAppWindows
3 楼
天天学习 [专家分:4570] 发布于 2008-12-24 09:52:00
Thank you all the same.
在vbGood上看到一篇讲Hook的文章
[url=http://www.vbgood.com/vb.good/article-do-view-articleid-492.html] HOOKS 说明书[/url]
如果用全局WH_GETMESSAGE Hook住GetMessage 或 PeekMessage的消息,不知道能不能实现.
不过VB不能做某些类型的全局HOOK (需要标准DLL的)?!
附:http://topic.csdn.net/t/20020614/21/804763.html
4 楼
天天学习 [专家分:4570] 发布于 2008-12-24 10:23:00
P.S.:
网上也有很多反对"VB不能做全局HOOK"的例子,通常都是用全局的键盘鼠标拦截来举例的.搞得我很是恍惚....[em10]
怎样才算是全局HOOk?
我简单地把"全局"理解成:当自己的程序不具有焦点时,仍然能取得键盘鼠标等的输入信息.如果这样来看的话,那"键盘鼠标拦截"的例子确实算是"全局"的了[em18]
我来回复