首先,我是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()
现在,解释器在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的建议。
再次对所有这些混乱表示抱歉。希望这能帮助其他新手。