【问题标题】:Syntax error with AddHandler in VBScriptVBScript 中 AddHandler 的语法错误
【发布时间】:2015-04-04 16:10:45
【问题描述】:

首先,我是 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 行抱怨“要求:'Microsoft'”。在这一点上,我不知道该怎么办。我尝试了Microsoft.AddHandler,但没有成功。

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

谢谢。

【问题讨论】:

  • So I made a .vbs file - 用什么做的?你真的安装了 Visual Studio 吗?
  • 在文件中编写代码并不需要 IDE。粗略的它有助于中型和大型项目。就我而言,我使用 notepad++,因为它的行数很少。
  • 改写:我会说一个人并不真正需要一个 IDE 来在文件中编写代码,除非解释器/编译器输出的有关错误的信息不足(这里显然就是这种情况)。就我而言,我使用了 notepad++,因为它的行数很少,但我现在正在考虑切换到 IDE。
  • 我想了解的是您实际使用的/认为您使用的语言。看起来你脑子里有 vbsript,上网,找到 vb.net 的代码示例,试图把它们放在一个 vbs 文件中,却没有意识到它们是完全不同的语言,然后把它们贴在这里让每个人都认为你打算使用 vb .net 放在首位。如果你没有安装 IDE,你可能也没有 VB 编译器,根本无法运行 vb.net 代码。
  • 如果你真的想要一个独立的非exe可执行脚本文件,那就是vbscript,但它没有可以弹出和挂起的表单。您将被限制为MsgBox

标签: vb.net addhandler


【解决方案1】:

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

事件类型

数据类型:uint16

访问类型:只读

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

价值含义

4 进入暂停

7 从挂起恢复

10 电源状态变化

11 OEM 活动

18 自动恢复

OEMEventCode

数据类型:uint16

访问类型:只读

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

【讨论】:

    【解决方案2】:

    您的代码是 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.NET 代码运行”。答案是你必须编译(没有 IDE 或调试器)。
    【解决方案3】:

    为了所有刚接触 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 的建议。

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

    【讨论】:

      猜你喜欢
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多