如何阻止windows关机?

CoolCHEN 2005-05-28 12:26:18
Private Sub Form_Unload(Cancel As Integer)
If MsgBox("真的退出吗?", vbYesNo) = vbNo Then Cancel = 1
End Sub

要求程序在退出时用户必须回答,但在win关机时会应该长时间不回答导致程序无响应而被强行关闭。怎么在不回答的情况下阻止win关机,回答后再关机?
...全文
905 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
留下些什么 2005-05-29
  • 打赏
  • 举报
回复
QueryUnload 事件


在一个窗体或应用程序关闭之前发生。当一个 MDIForm 对象关闭时,QueryUnload 事件先在 MDI 窗体发生,然后在所有 MDI 子窗体中发生。如果没有窗体取消 QueryUnload 事件,该 Unload 事件首先发生在所有其它窗体中,然后再发生在 MDI 窗体中。当一个子窗体或一个 Form 对象关闭时,在那个窗体中的 QueryUnload 事件先于该窗体的 Unload 事件发生。

语法

Private Sub Form_QueryUnload(cancel As Integer, unloadmode As Integer)

Private Sub MDIForm_QueryUnload(cancel As Integer, unloadmode As Integer)

QueryUnload 事件语法包括下列部分:

部分 描述
cancel 一个整数。将此参数设定为除 0 以外的任何值,可在所有已装载的窗体中停止 QueryUnload 事件,并阻止该窗体和应用程序的关闭。
unloadmode 一个值或一个常数,如返回值中所描述的,它指示引起 QueryUnload 事件的原因。


返回值

unloadmode 参数返回下列值:

常数 值 描述
vbFormControlMenu 0 用户从窗体上的“控件”菜单中选择“关闭”指令。
vbFormCode 1 Unload 语句被代码调用。
vbAppWindows 2 当前 Microsoft Windows 操作环境会话结束。
vbAppTaskManager 3 Microsoft Windows 任务管理器正在关闭应用程序。
vbFormMDIForm 4 MDI 子窗体正在关闭,因为 MDI 窗体正在关闭。
vbFormOwner 5 因为窗体的所有者正在关闭,所以窗体也在关闭。


这些常数是在对象浏览器中的 Visual Basic (VB) 对象库中列出。

说明

此事件的典型用法是在关闭一个应用程序之前用来确保包含在该应用程序中的窗体中没有未完成的任务。例如,如果还未保存某一窗体中的新数据,则应用程序会提示保存该数据。

当一个应用程序关闭时,可使用 QueryUnload 或 Unload 事件过程将 Cancel 属性设置为 True 来阻止关闭过程。但是,QueryUnload 事件是在任一个卸载之前在所有窗体中发生,而 Unload 是在每个窗体卸载时发生。
CoolCHEN 2005-05-29
  • 打赏
  • 举报
回复
哈哈,要的就是这个效果,拦掉windows就能做很多事情啦!
谢谢tanaya(蜡笔小新)!

DooDu(杜霖:I want,I can.(MmMVP马甲)) 的方法2000下就过不了,还是关了。
DooDu 2005-05-29
  • 打赏
  • 举报
回复
说明白意思就好说了
Private Sub Form_Unload(Cancel As Integer)
If MsgBox("真的退出吗?", vbYesNo or vbsystemmodal) = vbNo Then Cancel = 1
End Sub '▲▲▲▲▲▲▲▲

和yuexb(路人甲)思路一样,但我一直没有确认xp下也可以,98下保证能用。
laisiwei 2005-05-29
  • 打赏
  • 举报
回复
shutdown -a
guixian310 2005-05-29
  • 打赏
  • 举报
回复
啊,更正以下(对我上面那个号说的话的更正),真的啊,除了这个程序别的都关了!!强啊~~!!
tkl1980 2005-05-29
  • 打赏
  • 举报
回复
不对啊~在我这里的运行结果是:VB错误,强行关闭
wgf001 2005-05-29
  • 打赏
  • 举报
回复
学习
wumylove1234 2005-05-29
  • 打赏
  • 举报
回复
仔细看了一下,原来是这样处理的.把我的QQ,IE全关了,只剩下当前窗体没关.

原来是消息到这个窗体后,窗体把这个消息给扔掉了,而又没有去调用Windows的默认消息处理函数.

痛苦,还要重开IE.....
wumylove1234 2005-05-29
  • 打赏
  • 举报
回复
强,做个记号,改天看.
唐古拉山 2005-05-29
  • 打赏
  • 举报
回复

已经做的相当方便了

Private Sub Form_Load()
Call HookShutDown(Me.hWnd) '禁止关机
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Call UnHookShutDown(Me.hWnd) '撤销禁止关机
End Sub



唐古拉山 2005-05-29
  • 打赏
  • 举报
回复

下面给出答案

也可以查看我的Blog:

http://blog.csdn.net/tanaya/archive/2005/05/29/383602.aspx



在回调函数中处理两个消息就可以:WM_QUERYENDSESSION WM_ENDSESSION:

给出源代码:禁止关闭计算机模块(mStopShutDown.bas),程序:唐细刚 2005-5-29
-----------------------------------------------------------------
'mStopShutDown.bas
模块代码:

Private Const GWL_WNDPROC = (-4)
Private Const WM_ENDSESSION = &H16
Private Const WM_QUERYENDSESSION = &H11

Private WndProc As Long

Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc

As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As

Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long,

ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Sub HookShutDown(ByVal hWnd As Long)
If WndProc = 0 Then
WndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
End If
End Sub

Public Sub UnHookShutDown(ByVal hWnd As Long)
If WndProc <> 0 Then
Call SetWindowLong(hWnd, GWL_WNDPROC, WndProc)
WndProc = 0
End If
End Sub

Private Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal

lParam As Long) As Long
If uMsg = WM_QUERYENDSESSION Then
WindowProc = False '为0
Exit Function
ElseIf uMsg = WM_ENDSESSION Then
WindowProc = False '为0
Exit Function
End If
WindowProc = CallWindowProc(WndProc, hw, uMsg, wParam, lParam)
End Function



主窗体代码:

Private Sub Form_Load()
Call HookShutDown(Me.hWnd)
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Call UnHookShutDown(Me.hWnd)
End Sub





mycatlove 2005-05-29
  • 打赏
  • 举报
回复
没太明白楼主的意思

按照我的理解, 你在确认后再调用关机语句不就行了?
不确认就返回.
DooDu 2005-05-28
  • 打赏
  • 举报
回复
怎么阻止?如果用户不用win关机,直接按restart呢?
playice 2005-05-28
  • 打赏
  • 举报
回复
up
oyljerry 2005-05-28
  • 打赏
  • 举报
回复
WM_ExitWindow关机等消息
yuexb 2005-05-28
  • 打赏
  • 举报
回复
用模式的MsgBox就可以了。设置msgbox为模式的关键字我忘了,上msdn查一下
CoolCHEN 2005-05-28
  • 打赏
  • 举报
回复
只指用操作系统关机

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧