1

我正在 VBA 中编写一个脚本,它将监视注册表值,如果它更改脚本将覆盖它。到目前为止,我编写了一个脚本来检查注册表中的值并将其更新为给定值。但我的问题是如何每 2 分钟或值更改时更新注册表?请帮忙 !!!

On Error Resume Next
HKEY_CURRENT_USER = &H80000001
strComputer = "."
Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "Control Panel\Desktop"
ValueName = "ScreenSaveActive"
    objReg.GetStringValue HKEY_CURRENT_USER, strKeyPath, ValueName, strValue
    objReg.CreateKey HKEY_CURRENT_USER, strKeyPath
If IsNull(strValue) Then
    Wscript.Echo "The value is either Null or could not be found in the registry."
Else
    Wscript.Echo "Value: ", strValue
    strValue = "1"
    objReg.SetStringValue HKEY_CURRENT_USER, strKeyPath, ValueName, strValue
    Wscript.Echo "Value after change ", strValue
End If

问候, 厄尼

4

2 回答 2

2

只需将您的代码放在一个循环中,并告诉它在每次循环之间休眠 2 分钟,所以这样的事情可能会起作用:

Do While 1

    ...
    [your code here]
    ...

    WScript.Sleep(120 * 1000) ' 120 seconds in 2 minutes and it expects milliseconds
Loop

但是,如果该值为 null,那么继续进行可能没有任何意义,因此如果是这种情况,可能值得Exit Do在 about it is null 之后添加一行Echo以停止循环。

但请注意,您使用的是 VBscript,而不是 VBA(它们相似,但仍然是不同的语言)。

于 2012-07-18T15:41:43.697 回答
1

以下示例在 Excel VBA 中完成。将以下代码放入ThisWorkbook

Option Explicit
Public TimerActive As Boolean
Public TimerInterval As String ' e.g. "00:02:00"
Public TimerProcedure As String
Private NextSchedule As Variant

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    TimerActive = False
    Application.OnTime EarliestTime:=NextSchedule, _
                       Procedure:=TimerProcedure, Schedule:=False
End Sub

Private Sub Workbook_Open()
    TimerProcedure = "Module1.myTimerProc"
    TimerInterval = "00:00:10"
    TimerActive = True
    ScheduleTimer TimerInterval, TimerProcedure
End Sub


Public Sub ScheduleTimer(nextInterval As String, procName As String)
    NextSchedule = Now + TimeValue(nextInterval)
    Application.OnTime NextSchedule, procName
End Sub

然后,按照以下过程创建 Module1:

Option Explicit
Public Sub myTimerProc()
    With ThisWorkbook
        If .TimerActive Then
            Debug.Print Now & " Hi!"
            .ScheduleTimer .TimerInterval, .TimerProcedure
        End If
    End With
End Sub

这会在调试(立即)窗口中每 10 秒打印一次消息“Hi!”。您可以轻松地修改示例以写入注册表 - 只需在此模块中创建另一个过程并Debug.Print通过调用您编写的过程替换语句。计时器在您打开 excel 文件后立即激活,并在您关闭它之前停用。

注意

  • 您需要事件中的TimerActive标志以及语句 in以允许 Excel 正确关闭:如果您没有此额外代码,它将无限期地重新触发计时器。Workbook_CloseifmyTimerProc
  • 该文件需要保存为“启用宏的工作簿”,并且可能需要签名或放入受信任的位置。否则,其中的宏将不会运行(被 Excel 禁用)。
于 2012-07-18T15:52:19.693 回答