-4

首先,我是 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()

但是我遇到了各种语法错误(on 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但没有奏效。

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

谢谢你。

4

3 回答 3

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 一起使用。

事件类型

数据类型:uint16

访问类型:只读

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

价值含义

4 进入暂停

7 从暂停中恢复

10 电源状态变化

11 OEM活动

18 自动恢复

OEM事件代码

数据类型:uint16

访问类型:只读

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

于 2015-04-05T02:10:07.083 回答
0

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

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

于 2015-04-05T15:54:50.640 回答
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-没有第三方工具的命令行文件?forum=scripting

于 2015-04-05T03:38:16.367 回答