如何在截屏前稍等片刻?

How to wait a little time before screen capture?

所以我有下面的代码,它单击一个按钮然后捕获屏幕。但问题是它捕获了我单击按钮之前的屏幕内容,因为这一切在 VBA 中发生得如此之快。所以我在它捕获屏幕之前放了一个 Application.Wait 语句,但它没有帮助,同样的事情发生了。如果我将 Application.Wait 语句放在 Call keybd_event(VK_SNAPSHOT, 0, 0, 0) 之前,那么出于某种原因它会复制并粘贴实际代码,而不是捕获屏幕,这很奇怪。因此,我想知道如何等待它在有机会加载后捕获屏幕。我只包含了重要的代码。我正在使用两个屏幕(显示器),因此我正在与另一个屏幕上的网页进行交互。

Sub getTest()
    Dim CurrentPosition As POINTAPI

    Application.Wait (Now + TimeValue("0:00:02"))
    Call GetCursorPos(CurrentPosition)
    Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)

    Call CopyScreen
End Sub

Sub CopyScreen()
    Call keybd_event(VK_SNAPSHOT, 0, 0, 0)

    Workbooks.Add
    ActiveSheet.Paste

    ActiveWorkbook.SaveAs Filename:="TBD"
    ActiveWorkbook.Close
End Sub

您是否正在使用 IE 并打算捕获 screen/window?

您可能需要等到页面完成加载。等待一段时间并不能保证它已完成加载。

这就是我过去用来加载页面并确保它在我的代码中移动到下一步之前完成的方法(当然我从来没有想过截屏)。

    With IE
        .visible = true
        .Navigate URL
        Do While .Busy: DoEvents: Loop
        Do Until .ReadyState = READYSTATE_COMPLETE: DoEvents: Loop
    End With

希望对您有所帮助。

乔希

您可以尝试调用通用的“Pause”过程,例如:

Sub Pause(seconds As Single)
    Dim tmr As Single
    tmr = Timer
    Do
        DoEvents
    Loop Until Timer > (seconds + tmr)
End Sub

(...或相同的东西,但我通常使用它的 "compressed" 时尚:)

Sub Pause(sec As Single)
    Dim t As Single: t = Timer: Do: DoEvents: Loop Until Timer > (sec + t)
End Sub

调用程序就像:

Pause 5

...暂停五秒 同时仍允许系统事件发生

不幸的是,在尝试使用 mouse/keyboard 事件来控制这样的应用程序时,您会感到很头疼。您可能要考虑使用更适合自动化的单独应用程序。或者,也许您可​​以找到另一种获取图像的方法,具体取决于图像所在的应用程序。


更多信息:

您可以使用 Application.OnTime 事件,在 5 秒后调用函数:

Sub getTest()
    ' ...
    Call Application.OnTime (Now + TimeValue("00:00:5"), "CopyScreen")
End Sub