首先,我是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()
但是我遇到了各种语法错误(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()
现在口译员抱怨"要求:' Microsoft'"在AddHandler
行。此时我不知道该怎么做。我试过Microsoft.AddHandler
但没有用。
所以如果你能帮助我解决这个问题,我将不胜感激,并告诉我是否还有其他可以使这个小程序正常工作的东西。
谢谢。
答案 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来编译代码并运行它。这里有关于如何编写程序代码的说明。
答案 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 的建议。
再次抱歉所有这些混乱。希望这会有助于其他新手。