Что нового

Заморозка процесса на врема сна

seriousstas

Новичок
Сообщения
32
Репутация
0
Есть хорошо работающий скрипт для сна , гибернации .
помогите заморозить процесс на время сна (на примере блокнота) . Нужно для остановки таймеров в программе использующей JS .
скрипт такой :
Код:
#NoTrayIcon
#RequireAdmin
#pragma compile(Icon, "C:\Program Files (x86)\AutoIt3\Icons\au3script_v9.ico")
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_Run_AU3Check=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <WindowsConstants.au3>
#include<Process.au3>
; Это команда на сон
Global $PBT_APMSUSPEND = 0x0004
Global $PBT_APMRESUMESUSPEND = 0x0007

$hGUI = GUICreate("Restart", 100, 100, 1, 1)
GUIRegisterMsg($WM_POWERBROADCAST, "Standby")

Func Standby($hWnd, $Msg, $wParam, $lParam)
    Select
        ; Вход в спящий режим
        Case $wParam = $PBT_APMSUSPEND
            Suspend()
        ; Выход из спящего режима
        Case $wParam = $PBT_APMRESUMESUSPEND
            ResumeSuspend()
        Case Else
    EndSelect
EndFunc

; Вход в спящий режим
Func Suspend()

; ЗАМОРОЗИТЬ БЛОКНОТ

EndFunc

; Выход из спящего режима
Func ResumeSuspend();
; РАЗМОРОЗИТЬ БЛОКНОТ


EndFunc
 
Автор
S

seriousstas

Новичок
Сообщения
32
Репутация
0
похоже все тоже "заморозились" ).
Подскажите новичку что вставить вместо :
ЗАМОРОЗИТЬ БЛОКНОТ и РАЗМОРОЗИТЬ БЛОКНОТ
Спасибо!
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Надо в место ; РАЗМОРОЗИТЬ БЛОКНОТ вставить вызов функции разморозки процесса
С правами нужно определиться, нужны ли права администратора или нет.
Код:
;В начало скрипта вставить 
Global $fSuspended = False
;.. остальной код
; РАЗМОРОЗИТЬ БЛОКНОТ

_ProcSuspendResume("notepad.exe")
;.. остальной код

Код:
Func _ProcSuspendResume($process)
      $processid = ProcessExists($process)
      If $processid Then
          If $fSuspended Then
              $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $processid)
              $i_sucess = DllCall("ntdll.dll","int","NtResumeProcess","int",$ai_Handle[0])
              DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $ai_Handle)
              If IsArray($i_sucess) Then
                  $fSuspended = 0
                  Return 1
              Else
                  SetError(1)
                  Return 0
              Endif
          Else
              $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $processid)
              $i_sucess = DllCall("ntdll.dll","int","NtSuspendProcess","int",$ai_Handle[0])
              DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $ai_Handle)
              If IsArray($i_sucess) Then
                  $fSuspended = 1
                  Return 1
              Else
                  SetError(1)
                  Return 0
              Endif
          EndIf
      Else
          SetError(2)
          Return 0
      Endif
EndFunc
 
Автор
S

seriousstas

Новичок
Сообщения
32
Репутация
0
Сон состоит из двух этапов .
1 Вход - до отключения монтора выполняются команды.
2 Выход - вполняем другие команды .
inververs
Вы подсказали , как разморозить блокнот, а как заморозить при входе - не понял :scratch:
что должно-быть на месте ; ЗАМОРОЗИТЬ БЛОКНОТ ?
права нужны для (перезапуска некоторых) служб ...
 
A

Alofa

Гость
Код:
;#NoTrayIcon
#RequireAdmin
#include <WinAPI.au3>
#include <ProcessConstants.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>

; Это команда на сон
Global Const $PBT_APMSUSPEND = 0x0004
Global Const $PBT_APMRESUMESUSPEND = 0x0007
Global $sMyProcess = 'AkelPad.exe' ; ... Процесс

Local $iLabel1, $iEdit, $sLabelText, $hTimer, $iDiff
Opt("GUIOnEventMode", 1)
GUICreate("Restart", 160, 200, 1, 1, -1, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW))
$iLabel1 = GUICtrlCreateLabel('', 20, 5, 120, 40, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetColor(-1, 0xFF0004)
GUICtrlSetFont(-1, 12)
GUICtrlCreateGroup('Отчеты:', 5, 50, 150, 145)
$iEdit = GUICtrlCreateEdit('', 10, 65, 140, 125, BitOr($ES_MULTILINE, $ES_READONLY, $WS_VSCROLL))
GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit') 
GUISetState()

$hTimer = TimerInit()

GUIRegisterMsg($WM_POWERBROADCAST, "Standby")

While 1
	$iDiff = Round(TimerDiff($hTimer) / 1000, 3)
	GUICtrlSetData($iLabel1, $iDiff & ' сек.')
	Sleep(700)
WEnd

Func Standby($hWnd, $Msg, $wParam, $lParam)
	Switch $wParam
		Case $PBT_APMSUSPEND ; ..................... Вход в Сон
			If _ProcessSuspend($sMyProcess, True) Then $sLabelText &= 'Заморозка: ' & $iDiff & @CRLF
			GUICtrlSetData($iEdit, $sLabelText)
		Case $PBT_APMRESUMESUSPEND ; ............... Выход из Сна
			If _ProcessSuspend($sMyProcess) Then $sLabelText &= 'Разморозка: ' & $iDiff & @CRLF
			GUICtrlSetData($iEdit, $sLabelText)
	EndSwitch
EndFunc   ;==>Standby

Func _ProcessSuspend($sProcess, $vProcSetState = False)
	Local $hProcess, $iSucess, $iPID = ProcessExists($sProcess)
	If Not $iPID Then Return SetError(1, 0, 0)
	$vProcSetState = ($vProcSetState) ? 'NtSuspendProcess' : 'NtResumeProcess'
	$hProcess = _WinAPI_OpenProcess($PROCESS_ALL_ACCESS, 0, $iPID)
	If @error Then Return SetError(2, 0, 0)
	$iSucess = DllCall('ntdll.dll', 'int', $vProcSetState, 'int', $hProcess)
	_WinAPI_CloseHandle($hProcess)
	If Not IsArray($iSucess) Then Return SetError(3, 0, 0)
	Return 1
EndFunc   ;==>_ProcessSuspend

Func _Exit()
	Exit
EndFunc


Только думаю, ерунда это все. Все таймеры скачут от системного времени.
Также не забудьте почитать *Это*.
 
Автор
S

seriousstas

Новичок
Сообщения
32
Репутация
0
Только думаю, ерунда это все
Соглашусь ,как выход можно просто перезапустить программу,
но есть проблема - в Windows 8.1 и 10 на удход дается 2-3 секунды,
а что делать если нужно успеть завершить приложение .
Как это будет выглядеть совместно со скриптом выше? (подскажите)
Задача такая :
в момент выключения появляется MsgBox, и останавливает уход в сон на заданное время .
 
Верх