Страницы: 1
RSS
Предотвратить переход в режим ожидания (спящий режим, отключение экрана, выход их системы в результате бездействия), VBA
 
Здравствуйте.
Подскажите, пож-та, как можно программно при помощи VBA, предотвратить спящий режим (отключение экрана, выход из системы) при отсутствии действий со стороны пользователя?
В Excel запускается написанный макрос, который обрабатывает данные больше часа. Если не трогать ПК, то через некоторое время (примерно 10-15 мин), гаснет монитор и затем происходит автоматический выход из учетной записи. При этих действиях работа программы прерывается.
Нужно внедрить в этот макрос код, который по счетчику (либо по другому действию к примеру сверка времени) будет производить некие действия не дающие компьютеру войти в режим отключения экрана (спящего режима, выхода из системы), т.е. будет  препятствовать заложенному таймеру бездействия пользователя.

Нужно именно при помощи VBA. Код будет использоваться для описанной программы, чтобы она корректно завершила свои действия. И нужно именно на время работы программы.
 
 
Код
#If Win32 Then
    Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
    Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal x As Long, ByVal y As Long, ByVal cButton As Long, ByVal dwExtraInfo As Long)
#Else
    Declare PtrSafe Function SetCursorPos Lib "User" (ByVal x As Integer, ByVal y As Integer)
    Declare PtrSafe Sub mouse_event Lib "User" (ByVal dwFlags As Integer, ByVal x As Integer, ByVal y As Integer, ByVal cButton As Integer, ByVal dwExtraInfo As Integer)
#End If

Sub myMoveCursor()
'    Exit Sub
    Static dt As Date
    If dt < Now - TimeSerial(0, 5, 0) Then
        dt = Now
        Dim y As Integer
        Dim x As Integer
    
        On Error Resume Next
            y = ActiveWindow.ActivePane.PointsToScreenPixelsY(ActiveCell.Top + ActiveCell.Height * Rnd())
            x = ActiveWindow.ActivePane.PointsToScreenPixelsX(ActiveCell.Left + ActiveCell.Width * Rnd())
        On Error GoTo 0
        If y > 0 Then
        If x > 0 Then
            SetCursorPos x, y
            mouse_event &H2, 0&, 0&, 0&, 0&
            mouse_event &H4, 0&, 0&, 0&, 0&
        End If
        End If
        DoEvents
    End If
End Sub
Изменено: МатросНаЗебре - 25.10.2022 16:26:10
 
МатросНаЗебре, я что-то подобное пробовал делать, но комп у меня блокировался все равно :-)
Но Ваш вариант не пробовал, может и сработает
 
Может это поможет



Изменено: New - 25.10.2022 17:13:53
 
Цитата
asesja написал:
Нужно именно при помощи VBA. Код будет использоваться для описанной программы, чтобы она корректно завершила свои действия.
Для этого нужен Ваш комп перед глазами, чтобы увидеть все, что может мешать. А так - см.#4. Если не поможет - подробности в студию. Т.к.
Цитата
asesja написал:
Если не трогать ПК, то через некоторое время (примерно 10-15 мин), гаснет монитор и затем происходит автоматический выход из учетной записи. При этих действиях работа программы прерывается
 
В бытность на удаленке пользовался следующим способом - включал небольшой видеоролик в стандартном плеере (должен быть включен повтор и режим Отображать проигрыватель поверх остальных окон) и сдвигал окно за край экрана. Применительно к данной теме - в конце кода VBA можно добавить закрытие окна плеера через winapi.
 
Для этого есть API функции PowerCreateRequest PowerSetRequest, но как их использовать не подскажу. Видел также совет - включить презенацию Power Point.
Изменено: testuser - 25.10.2022 18:12:13
 
Может так попробуйте:
Код
Sub TurnOffSleep()' вызвать вначале Вашего макроса
    Dim WshShell As Object, strCommand As String
    strCommand = " & powercfg -X -monitor-timeout-ac 0 & powercfg -X -disk-timeout-ac 0 & powercfg -X -standby-timeout-ac 0 & powercfg -X -hibernate-timeout-ac 0"
    Set WshShell = CreateObject("WScript.Shell")
    WshShell.Run "cmd.exe /C powercfg -h off " & strCommand, 1, False
End Sub

Sub TurnOnSleep()'вызвать вконце Вашего макроса
    Dim WshShell As Object, strCommand As String
    strCommand = " & powercfg -X -monitor-timeout-ac 30 & powercfg -X -disk-timeout-ac 90 & powercfg -X -standby-timeout-ac 90 & powercfg -X -hibernate-timeout-ac 120"
    Set WshShell = CreateObject("WScript.Shell")
    WshShell.Run "cmd.exe /C powercfg -h on " & strCommand, 1, False
End Sub

Цитата
webley написал:
закрытие окна плеера
Код
Sub TurnOffPlayer()
    Dim WshShell As Object
    Set WshShell = CreateObject("WScript.Shell")
    WshShell.Run "cmd.exe /C TASKKILL /IM vlc.exe", 1, False
End Sub

У меня плеер vlc, найдете в диспетчере задач в процессах точное имя Вашего видео-плеера, если будете использовать метод от webley.
Изменено: DANIKOLA - 25.10.2022 18:34:34
 
ТУТ  :D  :D  :D
 
Цитата
написал:
В бытность на удаленке пользовался следующим способом - включал небольшой видеоролик в стандартном плеере (должен быть включен повтор и режим Отображать проигрыватель поверх остальных окон) и сдвигал окно за край экрана. Применительно к данной теме - в конце кода VBA можно добавить закрытие окна плеера через winapi.
Я знаю как обмануть компьютер в этом плане. Но у меня программа, которую будут использовать другие пользователе. Мне им написать, включите плеер с видео или установите что-нибудь типа mouse jiggler (симулятор движения мышки)? Как то некрасиво получается.
Как описал, ищу код VBA, который смогу встроить в свой макрос, который должен работать больше часа и не давать ПК переходить в спящий режим.

Спасибо за предложенные варианты. По возможности опробую.
 
Предложенные коды ещё не опробовал. Но я так понимаю, что нужно реализовать при помощи VBA симулятор несущественного движения мышкой примерно раз в 5 минут.
Изменено: asesja - 25.10.2022 21:41:01
 
asesja, это то, что вам дал МатросНаЗебре в сообщении #2
 
Спасибо всем кто откликнулся.
Из кода МатросаНаЗебре в сообщении #2,  частично получилось решить нужный вопрос.
 
частично - это как?
макрос, который частично решает задачу - это гавно-макрос (извините за бедность речи). если задача не решена макросом полностью - она не решена вообще. в программировании с этим строго
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
частично - это как?
Игорь, я использовал из сообщения #2 часть кода позволяющую производить нажатие мышкой, но не в случайном месте, а в месте где курсор находится. Это позволило решить вопрос про который написал в первом сообщении.
Полностью код не использовал, т.к. перемещение курсора рандомное и к тому-же у меня получилось добиться эффекта только при клике. Перемещение не требуется. В предложенном макросе клик тоже получается в рандомном месте. Это может привести к непредвиденным действиям.
И книга у меня скрыта (возможно это тоже влияет на работу предложенного макроса).
Почему считаю что мой вопрос решен частично? Потому что я описал, что мне нужно встроить предложенный макрос в общую программу. Но мне не подходит нажатие мышкой в рандомном месте или месте где курсор оставил пользователь. Нужно на заголовке имеющейся формы.
Для этого создал ещё одну тему с просьбой помочь или подсказать как это сделать.
Но в любом случае человек помог идеей с примером исполнения, и за это ему Спасибо!
Изменено: asesja - 29.10.2022 00:36:50
 
В качестве прикола расскажу, как я решал этот вопрос лет 20 тому назад.
Писал макрос, который раз в, допустим, час закрывал дисковод. А сам дисковод заранее открывал и в дырку его петелькой засовывал провод от мыши (то есть, закрыться полностью он не мог, пытался закрыться - провод мешал - он обратно открывался). Макрос закрывал его, провод дергался, мышь дергалась, спящий режим откладывался.
Это ни в коем случае не призыв к повтору, это просто поржать
Скажи мне, кудесник, любимец ба’гов...
 
Цитата
_Boroda_ написал:
Это ни в коем случае не призыв к повтору, это просто поржать
Теперь еще и привод попробуй найди :-)
По вопросам из тем форума, личку не читаю.
 
Эмуляция тыканья мышью
 
Цитата
написал:
Эмуляция тыканья мышью
Ран, спасибо. Как тыкать мышкой усвоил. Теперь понять бы еще как тыкнуть в нужное место, а именно на заготовок запущенной формы, ну или в заданную область формы.
 
Проверил, заставка не включается.
Код
Private Declare Function SetThreadExecutionState Lib "kernel32" (ByVal esFlags As Long) As Long
Private Const ES_SYSTEM_REQUIRED = &H1
Private Const ES_DISPLAY_REQUIRED = &H2
Private Const ES_CONTINUOUS = &H80000000

Sub Макрос()
     Call SetThreadExecutionState(ES_CONTINUOUS Or ES_DISPLAY_REQUIRED)

      'комманды

     Call SetThreadExecutionState(ES_CONTINUOUS)
End Sub
Изменено: testuser - 30.10.2022 07:23:31
 
testuser, спасибо! Для моего случая предложенный вами вариант подошёл.
При бездействии ПК экран не гаснет и пользователя не выбрасывает из системы. Программа корректно завершает свои действия и расчеты.

Данную тему можно считать закрытой.
Страницы: 1
Наверх