如何在屏幕捕获之前等待一些时间?

时间:2019-01-13 04:08:17

标签: excel vba automation screen-capture pause

所以我有以下代码,该代码单击一个按钮,然后捕获屏幕。但是问题在于它可以捕获我单击按钮之前的屏幕内容,因为这一切在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

3 个答案:

答案 0 :(得分:1)

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

getElementById

(...或同一件事,但以我通常使用的更“压缩”的方式:)

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

调用该过程就像:

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

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

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


更多信息:

答案 1 :(得分:0)

您是否正在使用IE并打算捕获该屏幕/窗口?

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

这是我过去用来加载页面并确保在完成下一步之前要完成的页面(请确保我从来没有想过截屏)。

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

我希望这会有所帮助。

乔什

答案 2 :(得分:0)

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

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