VBScript中的AddHandler语法错误



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

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

我在VBForums上找到了关于处理程序的代码:

'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:\.rootCIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM Win32_PowerManagementEvent")
Do
    Set objReceivedEvent = objEvents.NextEvent
    wscript.echo objReceivedEvent.EventType
Loop

与CScript一起使用。

事件类型

数据类型:uint16

访问类型:只读

系统电源状态的更改类型。

价值含义

4进入暂停

7从暂停恢复

10电源状态更改

11 OEM事件

18恢复自动

OEMEventCode

数据类型:uint16

访问类型:只读

当此类的EventType属性设置为11(OEM事件)时,由原始设备制造商(OEM)定义的系统电源状态;否则,此属性将设置为NULL。当APM BIOS发出APM OEM事件的信号时,会生成OEM事件。OEM事件代码在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和VBScript大熔炉的人的利益,我意识到VB(.net)和VBScript之间既有相似之处,也有差异。更不用说运行错误的VBScripts引起的运行时错误大多没有解决实际问题的线索。

我的意图是在Basic中运行一个简单的程序,但最终我混合了VB(.net)和VBScript。对不起那些试图跟踪我的人顺便说一句

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

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

我相信VS的替代方案是按照Trigger的建议。

再次对所有这些混乱表示抱歉。希望这能帮助其他新手。

相关内容

  • 没有找到相关文章

最新更新