Как немного подождать до захвата экрана? - PullRequest
0 голосов
/ 13 января 2019

Итак, у меня есть код ниже, который нажимает кнопку, а затем захватывает экран. Но проблема в том, что он фиксирует то, что было на экране до того, как я нажал кнопку, потому что все это происходит так быстро в 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 голосов
/ 13 января 2019

Вы можете попробовать вызвать общую процедуру " Pause ", такую ​​как:

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

Вызовите процедуру просто так:

Pause 5

... для пятисекундной паузы при одновременном разрешении системных событий .

К сожалению, у вас будет много головной боли при попытке использовать события мыши / клавиатуры для управления таким приложением. Вы можете рассмотреть возможность использования отдельного приложения, которое лучше подходит для автоматизации. Или, возможно, вы можете найти альтернативный способ получения вашего изображения, в зависимости от того, в каком приложении оно находится.


Дополнительная информация:

0 голосов
/ 13 января 2019

Вы можете использовать событие Application.OnTime, чтобы вызвать функцию через 5 секунд:

Sub getTest()
    ' ...
    Call Application.OnTime (Now + TimeValue("00:00:5"), "CopyScreen")
End Sub
0 голосов
/ 13 января 2019

Вы работаете с IE и хотите захватить этот экран / окно?

Возможно, вам нужно дождаться окончания загрузки страницы. Ожидание определенного периода времени не является гарантией того, что загрузка завершена

Это то, что я использовал в прошлом, чтобы загрузить страницу и убедиться, что она завершена, прежде чем перейти к следующему шагу в моем коде (при условии, что я никогда не пытался сделать снимок экрана).

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

Надеюсь, это поможет.

Josh

...