[VB] QueryUnload 事件

ZDNet软件频道 时间:2004-07-13 作者:Builderau.com.au |  我要评论()
本文关键词:vb
本周 Chunk 回答一位 Builder 澳大利亚读者的问题,这个问题提到了 VB 6 中的 QueryUnload 在 VB.NET 中如何处理。
本文译自Builder.com,未经许可请勿转载

本周 Chunk 回答一位 Builder 澳大利亚读者的问题,这个问题提到了 vb 6 中的 QueryUnload 在 vb.NET 中如何处理。

您好,Chuck:
在 Visual Basic 6.0 我可以决定何时使用“QueryUnload”事件关闭应用程序。但是在 Visual Basic .NET 中这个事件丢失了一个告诉我“为什么”关闭应用程序的参数。我想要知道我是应该退出应用程序(比如在系统当机期间),还是仅仅将应用程序放到任务栏中。

Chuck:
我比较吃惊,以前很少听到有人问确定为什么一个应用程序响应一个事件,而主要听到的问题都是有关事件本身的。例如,有些人问“因为操作系统关闭或其它一些原因而关闭应用程序”。

我在帮助文件中进行了快速搜索,找到一些帮助:“Form_QueryUnload 事件的 UnloadMode 参数不再被支持。QueryUnload 事件升级为 Closing 事件;这个事件已经没有了决定为什么被调用的机制。”

这在技术上讲是正确的,尽管绝对没有用。

在 Visual Basic 6.0 中,必须依赖于传递给被引发事件的参数,因为没有一种简单的方法来捕获 Windows 系统事件。在 .NET Framework 中这已经成为历史,.NET Framework 提供了一个简单地获取所有 Windows 系统消息的方法。

看上去你感兴趣的消息应该是系统关闭(System Shutdown),该消息在 Windows.H 中定义为 WM_ENDSESSION。

有了这些信息就很容易给出你要的解决方法,即应用程序只在操作系统指出了它已经关闭时退出。不要忘了包含 MyBase.WndProc(e) 这行代码,如果没有这行代码,将不会有默认的事件处理器被调用(因此,你的应用程序也不会运行)。

Const WM_ENDSESSION AsInteger = &H16

Dim osexit AsBoolean = False

ProtectedOverridesSubWndProc(ByRef e As Message)

        If (e.Msg = WM_ENDSESSION) Then

            osexit = True

            Application.Exit()

        EndIf

        MyBaseProc(e)

EndSub

PrivateSub Form1_Closing(ByVal sender AsObject, ByVal e As System.ComponentModel.CancelEventArgs) HandlesMyBase.Closing

        If osexit Then

            'Not doing anything will let the application close

        Else

            e.Cancel = True

'This will cause the application to ignore the close & continue running

            Me.WindowState = FormWindowState.Minimized

'Minimize the Window

        EndIf

EndSub 

 



责任编辑:李宁

欢迎评论投稿

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134