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()
但是我遇到了各种语法错误(As
、AddressOf
等)。经过一些测试和谷歌搜索后,我开始意识到一些 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 来编译您的代码并 运行 它。这里有关于如何编译您的程序代码的说明。
为了所有 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 的建议。
再次为所有这些混乱感到抱歉。希望这对其他新手有帮助。
首先,我是 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()
但是我遇到了各种语法错误(As
、AddressOf
等)。经过一些测试和谷歌搜索后,我开始意识到一些 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 来编译您的代码并 运行 它。这里有关于如何编译您的程序代码的说明。
为了所有 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 的建议。
再次为所有这些混乱感到抱歉。希望这对其他新手有帮助。