VBScript中的AddHandler语法错误

时间:2015-04-04 16:10:46

标签: vb.net 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()

现在口译员抱怨"要求:' Microsoft'"在AddHandler行。此时我不知道该怎么做。我试过Microsoft.AddHandler但没有用。

所以如果你能帮助我解决这个问题,我将不胜感激,并告诉我是否还有其他可以使这个小程序正常工作的东西。

谢谢。

3 个答案:

答案 0 :(得分:0)

这是一个无用的答案。因为它的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

     

数据类型:uint16

     

访问类型:只读

     

系统电源状态的变化类型。

     

价值含义

     

4输入暂停

     

7从暂停中恢复

     

10电源状态更改

     

11 OEM事件

     

18继续自动

     

OEMEventCode

     

数据类型:uint16

     

访问类型:只读

     

当此类的EventType属性设置为11(OEM事件)时,由原始设备制造商(OEM)定义的系统电源状态;否则,此属性设置为NULL。当APM BIOS发出APM OEM事件信号时,将生成OEM事件。 OEM事件代码的范围为0x0200h - 0x02FFh。

答案 1 :(得分:0)

您的代码是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

答案 2 :(得分:0)

为了所有那些不熟悉VB,VB.net和VBScript熔炉的人的利益,我意识到VB(.net)和VBScript之间存在着相似之处。更不用说运行错误的VBScripts引发的运行时错误大多不能解决实际问题。

我的目的是在Basic中运行一个简单的程序,但我最终混合了VB(.net)和VBScript。对于那些试图跟进我的人抱歉。

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

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

我认为VS的替代方案符合 Trigger 的建议。

再次抱歉所有这些混乱。希望这会有助于其他新手。