如何阻止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关机,回答后再关机?
...全文
908 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
  • 打赏
  • 举报
回复
只指用操作系统关机
  虚拟机是真真的所谓‘万恶之源’的软件,由于有了这款软件,将我们之前的学习方式就测底粉碎了,我们之前如果需要学习硬件设备,例如思科的路由或交换机等,或者其他品牌的设备,我们都需要到现场去,除了舟车劳顿之外,我们的时间成本和经济成本都非常的大,即便如此能够接触设备的时间还少,故掌握的就非常肤浅。还有,我们如果要学习计算机网络,同样我们去要到机房中,这样才能获得真实的环境学习。但是,能够获得这种机会的有志青年有多少呢?!  自从某年某月开始,虚拟化产品大行其道,使得我们对硬件(例如网络产品),对操作系统(例如:微软Server、Linux、Unix),对于网络环境的个人布置变得有可能,且可以自我深造,所以学好或参透一款产品的虚拟机(不是浮于表面装上就行,出现虚拟机故障就无从下手处理问题),就变得十分重要和迫切。不要说你已经会使用虚拟机了,看看老师提供的目录是否全部掌握,如果是!感谢阅读!====================================第一章:初探虚拟机01. 虚拟机简介02. 企业级虚拟机产品和虚拟化带来的诸多优势03. 下载VMware桌面级产品第二章:安装虚拟机04. 演示安装 Windows 10和注意事项05. 安装VMware Tools工具,启用UNTIY功能06. Windows10 关机快照前的七项预备工作第三章:建立虚拟机和物理机睦邻友好关系07. 物理机与虚拟机交换文件的五种方式08. 详解第五种方式:物理机挂载虚拟机的磁盘第四章:虚拟机特色磁盘09. 创建永久盘:即快照不恢复内容10. 创建非永久盘:即功能类似于硬件系统保护卡第五章:生产虚拟机的多种方式11. 使用虚拟机磁盘文件或配置文件,间接或直接创建虚拟机12. 利用虚拟机快照(Without SID),克隆出多个虚拟机第六章:虚拟机的NAT代理和端口映射13. 远程(控制_访问)共享的虚拟机14. 内网计算机可以通过NAT代理上网:基础配置15. 内网计算机可以通过NAT代理上网:代理上网16. 外网计算机可以通过Port端口映射访问内网计算机17. 外网主机通过二级Port端口映射,远程控制子子网(孙级)主机18. 外网主机通过端口映射,远程控制子网主机第七章:详解网络编辑器19. 详解虚拟网络编辑器(重点)第八章:抓取物理机虚拟机化20. P2V 基础环境介绍和配置21. P2V 经典模式:三台主机协作完成22. P2V 主从模式(双台)和主主(单台)

7,765

社区成员

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

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