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