回 帖 发 新 帖 刷新版面

主题:[讨论]如何保证自己的程序第一个获得关机时的消息?

今天翻看以前写的代码时,发现一个通过拦截wm_QueryEndSession和wm_endSession来实现的阻止关机的小程序。
虽然最终能够阻止关机,但是一些程序由于比本程序先得到wm_queryEndSession和wm_endsession消息,还是被关闭了。(个人理解)。
有没有方法让自己的程序第一个获得关机时的消息,然后“吃”掉它,不再往下传给其它程序???

回复列表 (共4个回复)

沙发

在窗体的事件可以拦截到的:
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.

板凳

刚下载了一个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 楼

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 楼

P.S.:
网上也有很多反对"VB不能做全局HOOK"的例子,通常都是用全局的键盘鼠标拦截来举例的.搞得我很是恍惚....[em10]

怎样才算是全局HOOk?
我简单地把"全局"理解成:当自己的程序不具有焦点时,仍然能取得键盘鼠标等的输入信息.如果这样来看的话,那"键盘鼠标拦截"的例子确实算是"全局"的了[em18]

我来回复

您尚未登录,请登录后再回复。点此登录或注册