【问题标题】:prevent user closing a HTA防止用户关闭 HTA
【发布时间】:2022-05-03 07:44:07
【问题描述】:

在 HTA 中使用 vbscript

目标:防止用户关闭 HTA(通过我的自定义按钮或使用 Windows 任务管理器除外)

据我从各种网页了解;在 HTA SYSMENU 中单击关闭按钮时,您无法阻止 HTA 关闭。因此我的解决方案是首先防止用户点击关闭。

首先是禁用系统菜单:

<HTA:APPLICATION SYSMENU="no" />

注意。我将用自定义菜单替换系统菜单 - 任何指向此方面的良好指南的链接将不胜感激。

接下来阻止键盘快捷键alt+f4、f5或转义如下:

Function Document_onKeyDown()

    Dim alt
    alt = window.event.altKey
    Select Case window.event.keyCode
        Case 27,116
            window.event.keyCode = 0
            window.event.cancelBubble = true
            Document_onKeyDown = False
        Case 115
            If alt Then
                window.event.keyCode = 0
                window.event.cancelBubble = true
                Document_onKeyDown = False
            End If
        Case Else
            Document_onKeyDown = True
    End Select

End Function

最后我想阻止用户使用我的 HTA 应用程序的 windows 任务栏上下文菜单。

如何防止用户通过右键单击我的 HTA 看到上下文菜单?

注意。 HTA 窗口不能全屏

【问题讨论】:

    标签: vbscript hta


    【解决方案1】:

    不要混淆用户关闭应用程序的选项。用户应该如何工作不是由您决定的。而是添加一个清理过程,您可以在其中执行所有“关闭”任务并在 beforeunload 事件上调用它:

    <html>
    <head>
    <title>sample</title>
    <HTA:APPLICATION ID="oHTA"
        APPLICATIONNAME="sample"
    >
    <script language="VBScript">
    Sub cleanup
      'clean up stuff here
    End Sub
    </script>
    </head>
    
    <body onbeforeunload=cleanup>
    ...
    </body>
    </html>

    【讨论】:

    • 我通常不会关心用户如何关闭应用程序。但是在这种情况下;如果用户在等待 WShell.Run 操作完成时关闭 hta,mshta.exe 进程将不会终止。理想情况下,在 onBeforeUnload 中,我要么在 WShell.Run 正在进行时取消关闭尝试(但此功能似乎不起作用),要么等待 WShell.Run 完成然后关闭(似乎也不起作用)
    • @Danaldo 为什么你首先需要等待WShell.Run?异步运行外部进程,因此 HTA 是否终止无关紧要。如果您的 HTA 中的其他代码依赖于外部程序的完成,您可以使用WMI 来跟踪其状态。它比Run 方法复杂一点,但很可能是一种更清洁的解决方案。
    • 使用 WMI 而不是 wshell.run - 如果我要运行第二个脚本,如何查看使用 WScript.Quit 设置的返回代码?如果不可能,我知道我可以将值写入临时文件并在 WMI 指示脚本已完成时读取此文件。但是,如果 WMI 对象能够为您提供返回码,那就更好了。最好使用 processID...
    • @Danaldo 外部 VBScript 可以在 volatile environment 中设置一个变量来指示其状态。或者您可以简单地将脚本代码集成到 HTA 中并完全避免该问题。
    • 脚本代码最初在 HTA 中。我提取了脚本,因为它很长,并且由于 HTA 是单线程的,它导致 UI 无响应。由于它是后台脚本,因此 HTA 无需等待完成。但是,当脚本完成时,HTA 需要结果。 volatile 环境变量的创建是否取决于用户权限,还是因为它仅对单个登录会话有效意味着它与用户权限无关?
    【解决方案2】:

    关于:

    如何防止用户通过右键单击我的 HTA 看到上下文菜单?

    <HTA:APPLICATION contextMenu="no">
    

    【讨论】:

      【解决方案3】:
      <HTA:APPLICATION showintaskbar="no">
      

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      • 仅此选项是不够的。查看其他答案。但是,一般来说,请遵循以下好的建议:“不要乱用用户关闭应用程序的选项”。
      猜你喜欢
      • 1970-01-01
      • 2013-08-30
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      相关资源
      最近更新 更多