2015-04-04 61 views
-4

首先,我很新手的VB語言,VB腳本和VB.net編程,但在其他語言和平臺相當擅長。語法錯誤與VBScript中的AddHandler

我的目標是從命令行運行一個簡單的基於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線。在這一點上,我不知道該怎麼做。我試過Microsoft.AddHandler但沒有工作。

所以,如果你能幫助我解決這一問題,並告訴我是否還有其他可以使這個小程序工作的東西,我將不勝感激。

謝謝。

+0

'所以我做了一個.vbs文件' - 做了什麼?你真的安裝了Visual Studio嗎? – GSerg 2015-04-04 19:47:39

+0

其中一個並不需要IDE來編寫文件中的代碼。粗糙它有助於中型和大型項目。在我的情況下,我使用記事本++,因爲它有幾行。 – 2015-04-05 14:17:06

+0

換言之:除非解釋器/編譯器輸出的錯誤信息不足(這裏顯然是這種情況),否則我不會說真的需要IDE來編寫代碼。在我的情況下,我使用記事本++,因爲它有幾行,但我現在正在考慮切換到IDE。 – 2015-04-05 14:39:36

回答

0

對於那些誰是新的VB,VB.net和VBScript熔爐的好處,我意識到有VB(.NET)和VBScript之間儘可能多的差異有相似之處。更不要說運行錯誤的VBScript引起的運行時錯誤大多不能解決實際問題。

我的目的是在Basic中運行一個簡單的程序,但我最終混合了VB(.net)和VBScript。對不起那些試圖跟隨我btw的人。

就AddHandler而言,看起來我不能在VBScript中調用這個函數,所以我需要用VB(.net)編寫它;因此.vbs文件不是解決方案。

最後我安裝了VS(Visual Studio),並讓我的程序編譯並運行。 VB源文件具有.vb擴展名,編譯後生成可執行文件。 VS在編碼時提供了很多即時完成功能,這有助於第一次編寫代碼。與我的想法和評論相反,即使是簡單的Basic程序,建議使用VS(Express版本不收費)。

我相信VS的替代是按照觸發的建議。

再次抱歉,所有這些困惑。希望這會幫助其他新手。

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恢復自動

OEMEventCode

數據類型:UINT16

訪問類型:只讀由原始設備製造商(OEM),當這個類的事件類型屬性被設置爲11限定

系統電源狀態( OEM活動);否則,該屬性設置爲NULL。當APM BIOS發出APM OEM事件信號時,會生成OEM事件。 OEM事件代碼的範圍是0x0200h - 0x02FFh。

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-files-from-the-command-line-without-third-party-tools?forum=scripting

+1

在你的答案中提供了一些代碼... – 2015-04-05 03:48:24

+1

我的其他答案有他可以使用的代碼。但問題是「如何讓VB.NET代碼運行」。答案是你必須編譯(沒有IDE或調試器)。 – Trigger 2015-04-05 05:55:43