Синтаксическая ошибка с AddHandler в VBScript
Прежде всего, я довольно новичок в языке 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
но не сработало.
Поэтому я был бы признателен, если бы вы могли помочь мне исправить эту строку и сказать, есть ли что-то еще, что могло бы заставить эту маленькую программу работать.
Спасибо.
3 ответа
Для всех тех, кто плохо знаком с VB, VB.net и VBScript, я понял, что между VB (.net) и VBScript существует столько же различий, сколько и сходств. Не говоря уже о том, что ошибки времени выполнения, возникающие при запуске ошибочных скриптов VBS, в большинстве случаев не дают подсказки для решения актуальной проблемы.
Я намеревался запустить простую программу на Basic, но в итоге я смешал VB (.net) и VBScript. Извините тем, кто пытался следовать за мной, кстати.
Что касается AddHandler, то, похоже, я не могу вызвать эту функцию в VBScript, поэтому мне нужно было написать ее в VB(.net); Таким образом, файл.vbs не является решением.
В конце концов я установил VS (Visual Studio) и скомпилировал и запустил мою программу. Источники VB имеют расширение.vb и приводят к выполнению исполняемого файла после компиляции. VS предлагает много мгновенных завершений при кодировании, которые помогают писать код сразу с первого раза. Вопреки тому, что я думал и комментировал, даже для упрощенных базовых программ рекомендуется иметь VS (версия Express ничего не стоит).
Я полагаю, что альтернатива VS - согласно предложению Trigger.
Опять извините за все это замешательство. Надеюсь, что это поможет другим новичкам.
Ваш код VB.NET, а не VBScript. Вам нужно использовать VB.NET для компиляции кода и его запуска. Здесь есть инструкции о том, КАК СОСТАВИТЬ КОД ПРОГРАММЫ.
Ну вот бесполезный ответ. Как это 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 Event
18 Возобновить Автомат
OEMEventCode
Тип данных: uint16
Тип доступа: только для чтения
Состояние питания системы, определенное производителем исходного оборудования (OEM), когда для свойства EventType этого класса установлено значение 11 (OEM Event); в противном случае это свойство имеет значение NULL. События OEM генерируются, когда APM BIOS сообщает о событии OEM APM. Коды событий OEM находятся в диапазоне 0x0200h - 0x02FFh.