VBScript 中 AddHandler 的语法错误

Syntax error with AddHandler in VBScript

首先,我是 VB 语言、VB 脚本和 VB.net 编程的新手,但对其他语言和平台相当擅长。

我的目标是 运行 一个简单的基于 VB 的命令行程序,并让它弹出一个消息框(这部分我想通了)。此外,如果计算机同时进入睡眠模式(或从睡眠模式恢复),我希望消息框(以及脚本)终止。

我在 VB关于处理程序的论坛上找到了这段代码:

'add the handlers for the system standby, resume, and shutdown
AddHandler Microsoft.Win32.SystemEvents.PowerModeChanged, AddressOf PowerModeChanged
AddHandler Microsoft.Win32.SystemEvents.SessionEnding, AddressOf SessionEnding

[...]

Private Sub PowerModeChanged(ByVal sender As System.Object, _
 ByVal e As Microsoft.Win32.PowerModeChangedEventArgs)
    Select Case e.Mode
        Case Microsoft.Win32.PowerModes.Resume
            'windows is resuming from sleep
        Case Microsoft.Win32.PowerModes.Suspend
            'goodnite windows
    End Select
End Sub

Private Sub SessionEnding(ByVal sender As System.Object, _
ByVal e As Microsoft.Win32.SessionEndingEventArgs)
    Select Case e.Reason
        Case Microsoft.Win32.SessionEndReasons.Logoff
            'logoff
        Case Microsoft.Win32.SessionEndReasons.SystemShutdown
           'shutdown
    End Select
End Sub

所以我制作了一个 .vbs 文件,它使用了上面的(第一个版本)和 运行 它:

Sub PowerModeChanged(ByVal sender As System.Object, _
    ByVal e As Microsoft.Win32.PowerModeChangedEventArgs)
    Select Case e.Mode
        Case Microsoft.Win32.PowerModes.Resume
            'windows is resuming from sleep
            WScript.Quit
        Case Microsoft.Win32.PowerModes.Suspend
            'goodnite windows
            WScript.Quit
    End Select
End Sub

Sub Main()
    Set objArgs = WScript.Arguments
    msgText = objArgs(0)
    AddHandler Microsoft.Win32.SystemEvents.PowerModeChanged, AddressOf PowerModeChanged
    MsgBox msgText
End Sub

Main()

但是我遇到了各种语法错误(AsAddressOf 等)。经过一些测试和谷歌搜索后,我开始意识到一些 VB 实体似乎比其他实体更严格类型并且具有更进化的语法。所以这是我的第二个版本,它几乎成功地通过了语法阶段:

Sub PowerModeChanged(sender, e)
    Select Case e.Mode
        Case Microsoft.Win32.PowerModes.Resume
            'windows is resuming from sleep
            WScript.Quit
        Case Microsoft.Win32.PowerModes.Suspend
            'goodnite windows
            WScript.Quit
    End Select
End Sub

Sub Main()
    Set objArgs = WScript.Arguments
    msgText = objArgs(0)
    AddHandler Microsoft.Win32.SystemEvents.PowerModeChanged, PowerModeChanged
    MsgBox msgText
End Sub

Main()

现在解释器在 AddHandler 行抱怨 "Require: 'Microsoft'"。在这一点上,我不知道该怎么办。我尝试了 Microsoft.AddHandler 但没有成功。

所以,如果你能帮我修复这条线,我将不胜感激,并告诉我是否还有其他任何东西可以使这个小程序正常工作。

谢谢。

好吧,这是一个无用的答案。因为它是 vbscript 而不是他的代码 VB.NET。

Set WshShell = WScript.CreateObject("WScript.Shell")
Set objWMIService = GetObject("winmgmts:\.\root\CIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM Win32_PowerManagementEvent")

Do
    Set objReceivedEvent = objEvents.NextEvent
    wscript.echo objReceivedEvent.EventType
Loop

与 CScript 一起使用。

EventType

Data type: uint16

Access type: Read-only

Type of change in the system power state.

Value Meaning

4 Entering Suspend

7 Resume from Suspend

10 Power Status Change

11 OEM Event

18 Resume Automatic

OEMEventCode

Data type: uint16

Access type: Read-only

System power state defined by the original equipment manufacturer (OEM) when the EventType property of this class is set to 11 (OEM Event); otherwise, this property is set to NULL. OEM events are generated when an APM BIOS signals an APM OEM event. OEM event codes are in the range 0x0200h - 0x02FFh.

您的代码 VB.NET 不是 VBScript。您需要使用 VB.NET 来编译您的代码并 运行 它。这里有关于如何编译您的程序代码的说明。

http://social.msdn.microsoft.com/Forums/en-US/adcae113-4758-481a-a367-60d5d14d97d6/this-is-how-to-turn-vbs-and-js-files-into-exe-files-from-the-command-line-without-third-party-tools?forum=scripting

为了所有 VB、VB.net 和 VB 脚本熔炉的新手,我意识到 VB(.net)和VBScript一样有相似之处。更不用说 运行 宁错误 VB 脚本引发的 运行 时间错误大多没有提供解决实际问题的线索。

我的意图是 运行 Basic 中的一个简单程序,但我最终混合了 VB(.net) 和 VBScript。顺便说一句,对那些试图关注我的人表示抱歉。

就 AddHandler 而言,我似乎无法在 VBScript 中调用此函数,因此我需要将其编写在 VB(.net) 中;因此 .vbs 文件不是解决方案。

最后我安装了 VS (Visual Studio) 并编译了我的程序 运行。 VB 源代码具有 .vb 扩展名,编译后生成可执行文件。 VS 在编码时提供了许多即时完成,这有助于在第一时间编写代码。与我的想法和评论相反,即使对于简单的 Basic 程序,也建议使用 VS(Express 版本不花钱)。

我认为 VS 的替代方案是根据 Trigger 的建议。

再次为所有这些混乱感到抱歉。希望这对其他新手有帮助。