【发布时间】:2018-01-24 23:34:53
【问题描述】:
当我打开 word 然后打开我的测试文档时,以下代码按预期工作。但是,如果我打开测试文档以启动 Word 的第一个实例,则计时器会在 Word 加载时启动。然后 Word 处于加载状态,直到计时器用完,文档关闭并打开一个空的 Word 应用程序。预期的操作是打开文档;如果闲置了设定的时间,保存并关闭文档。
我的一些用户共享一个文档,并且有一个坏习惯,即在打开文档的情况下锁定他们的计算机,从而锁定文件以防止其他任何人编辑它。 这样做的目的是保存文件并在 x 次后关闭文档。
Private Sub Document_open()
StartCheckingIdle
End Sub
下面的 TIMEOUTTIME 设置为 5 秒以进行测试,但将其设置为 5 分钟,如果在双击文档打开之前 Word 未打开,则文档只会在加载那 5 分钟。
Option Explicit
'Set the constant below for how long you want it to be idle before triggering
' Enter the time in hours:minutes:seconds form, like "00:30:00" for 30 minutes
Private Const TIMEOUTTIME As String = "00:00:05"
Private Declare Function GetQueueStatus Lib "user32" (ByVal fuFlags As Long) As Long
Private Const QS_KEY = &H1
Private Const QS_MOUSEMOVE = &H2
Private Const QS_MOUSEBUTTON = &H4
Private Const QS_MOUSE = (QS_MOUSEMOVE Or QS_MOUSEBUTTON)
Private Const QS_INPUT = (QS_MOUSE Or QS_KEY)
Private bCancel As Boolean
Private Sub WaitForIdle()
Dim t As Double
t = Now
Do While bCancel = False
If GetQueueStatus(QS_INPUT) Then
t = Now
DoEvents
End If
If Now - t >= TimeValue(TIMEOUTTIME) Then Exit Do
Loop
End Sub
Public Sub StartCheckingIdle()
Do Until bCancel
WaitForIdle
If bCancel = False Then
bCancel = True
ThisDocument.Close True
End If
Do Until GetQueueStatus(QS_INPUT) Or bCancel
DoEvents
Loop
Loop
End Sub
Public Sub StopCheckingIdle()
bCancel = True
End Sub
目前正在尝试编写 Word 文档,但最终也需要将其应用于 excel 文件。 是的,我在这里的另一个问题中挖掘了这段代码,尽管我认为它可能有点过时了。我正在运行 Office 2010。
【问题讨论】:
-
如果建议的 DO EVENTS 不起作用,我认为您需要一个“全局加载项”来监控类似的内容 - 作为 Word 应用程序的一部分加载的内容,而不是文档。这可以是指定加载项位置中的 Word 模板,也可以是 COM 或 VSTO 加载项。