Set objEventObject = objEventSource.NextEvent()
我们所做的是告诉脚本等待,直到下一个我们所关心的事件发生。换句话说,脚本将停留在此行代码上,直到有进程被创建、删除或修改。假设进程始终不变,假设我们始终不创建、删除或修改进程。在这种情况下,脚本就会永远停在这儿,耐心等待。以防万一。
现在,我们知道您正在想什么。您正在想:“嗨,稍等一下。我们只关心屏幕保护程序。Microsoft Word 也在进程中运行。如果我们启动 Microsoft Word,从而创建 Winword.exe 进程的新实例,那不也会触发通知吗?”
您说对了:会触发通知。接下来这行代码就用来解决这个问题。启动 Word(或者任何可执行文件,就这一点而言)确实都会发出通知。但我们可以使用下面这行代码解决这个问题:
If Right(objEventObject.TargetInstance.Name, 4) = ".scr" Then
在这里,我们使用 Right 函数检查触发通知的进程的名称。如果名称中最右侧的四个字符等于 .scr,我们便假定正在处理的是屏幕保护程序,因为屏幕保护程序的名称类似 Marquee.scr。如果名称中的最后四个字符不是 .scr,我们便只是循环一次,然后等待下一个事件发生。
那么,如果最后四个字符是 .scr 会怎样?在这种情况下,我们只关心两种可能:屏幕保护程序启动或屏幕保护程序结束。(我们并不关心是否有人修改屏幕保护程序的属性。)为处理这两种可能,我们设置一个 Select Case 块,用于检查事件实例的 Class:
Select Case objEventObject.Path_.Class
如果 Class 等于 __InstanceCreationEvent,则意味着已创建新进程(即新屏幕保护程序)。在第一个 Case 语句中,我们检查 Class 是否等于 __InstanceCreationEvent。如果等于,我们便回显如下事实:特定屏幕保护程序(使用进程名称表示)在特定时间(使用 VBScript 函数 Now)启动:
Case "__InstanceCreationEvent"
Wscript.Echo "Screensaver " & objEventObject.TargetInstance.Name & " started: " & Now
意思清楚了,对吧?现在,假设屏幕保护程序已结束,这就会导致删除屏幕保护程序进程。为处理这种可能,我们检查 __InstanceDeletionEvent 类是否有新实例。如果发生属于该类的事件(表示已删除屏幕保护程序进程),我们便回显如下事实 - 指定的屏幕保护程序在指定时间停止:
Case "__InstanceDeletionEvent"
Wscript.Echo "Screensaver " & objEventObject.TargetInstance.Name & " ended: " & Now







