Advertisement
Guest User

Untitled

a guest
Jun 16th, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 6.01 KB | None | 0 0
  1. ;Если включен автопереход в сон/гибернацию: выбрать программу, до завершения которой фича будет отключена.
  2. ;2018.05.11
  3.  
  4. #NoTrayIcon
  5.  
  6. Opt('WinWaitDelay', 100)
  7.  
  8. Global Const $GUI_EVENT_CLOSE = -3
  9.  
  10. Global Const $LVS_SINGLESEL = 0x0004
  11. Global Const $LVS_SORTASCENDING = 0x0010
  12. Global Const $LVM_FIRST = 0x1000
  13. Global Const $LVM_SETCOLUMNWIDTH = ($LVM_FIRST + 30)
  14.  
  15. Global Const $ES_CONTINUOUS = 0x80000000
  16. ;Global Const $ES_DISPLAY_REQUIRED = 0x00000002
  17. Global Const $ES_SYSTEM_REQUIRED = 0x00000001
  18.  
  19. Local $hGUI, $iControl, $sActivePowerScheme, $iCompToSleep, $aProcessList, $ListView, $i, $Button1, $Button2, $item, $text, $iTmp = 0
  20.  
  21. ;Проверяем, что это не запуск второй копии скрипта
  22. If WinExists("DontSleep - " & @ScriptFullPath) Then
  23.     If MsgBox(4 + 32+ 4096, "DontSleep", "Завершить скрипт " & Chr(34) & "DontSleep" & Chr(34) & "?") = 6 Then
  24.         $hGUI = WinGetHandle("DontSleep - " & @ScriptFullPath)
  25.         If Not @error Then
  26.             WinClose($hGUI)
  27.         Else
  28.             MsgBox(16 + 4096, "DontSleep", "Unknown error: WinGetHandle()")
  29.         EndIf
  30.     EndIf
  31.     Exit
  32. EndIf
  33. ;Устанавливаем заголовок
  34. AutoItWinSetTitle("DontSleep - " & @ScriptFullPath)
  35.  
  36. ;Активная схема
  37. $sActivePowerScheme = RegRead('HKLM\SYSTEM\CurrentControlSet\Control\Power\User\PowerSchemes', 'ActivePowerScheme')
  38. ;Перевод компьютера в спящий режим
  39. $iCompToSleep = RegRead('HKLM\SYSTEM\CurrentControlSet\Control\Power\User\PowerSchemes\' & $sActivePowerScheme & '\238c9fa8-0aad-41ed-83f4-97be242c8f20\29f6c1db-86da-48c5-9fdb-f2b67b1f44da', 'ACSettingIndex')
  40. If @error Then $iCompToSleep = 1
  41. ;Отключение дисплея
  42. ;RegRead('HKLM\SYSTEM\CurrentControlSet\Control\Power\User\PowerSchemes\' & $sActivePowerScheme & '\7516b95f-f776-4464-8c53-06167f40cc99\3c0bc021-c8a8-4e07-a973-6b14cbcb2b7e', 'ACSettingIndex')
  43. If $iCompToSleep = 0 Then Exit
  44.  
  45. ;Список всех процессов
  46. $aProcessList = ProcessList()
  47. ;GUI
  48. $hGUI = GUICreate('Process List', 260, 350)
  49. $ListView = GUICtrlCreateListView('Имя|PID', 8, 8, 244, 300, BitOR($LVS_SINGLESEL, $LVS_SORTASCENDING))
  50. For $i = 1 To $aProcessList[0][0]
  51.     ;Убираем кучу всего:
  52.     If $aProcessList[$i][0] = '[System Process]' Then ContinueLoop
  53.     If $aProcessList[$i][0] = 'System' Then ContinueLoop
  54.     If $aProcessList[$i][1] = @AutoItPID Then ContinueLoop
  55.     If StringRegExp($aProcessList[$i][0], '(?i)^(aswidsagent|atieclxx|atiesrxx|audiodg|AvastSvc|AvastUI|btwdins|CCC|cfp|cmdagent|conhost|CoolSense|csrss|cvhsvc|DCService|DCSHelper|DTSAudioService|DTSAudioService64|dwm|ezSharedSvcHost|Fuel\.Service|HPDrvMntSvc|hpqWmiEx|hpservice|HydraDM|KMSSS|lsass|lsm|MOM|nlssrv32|OFFICEVIRT|OSPPSVC|RAVBg64|RtHDVBg|RtkNGUI|RtkNGUI64|services|sftlist|sftvsa|smss|spoolsv|ss_conn_service|stacsv|sttray|svchost|taskhost|wininit|winlogon|wlanext|WmiPrvSE|WUDFHost|)\.exe$', 0) Then ContinueLoop
  56.     GUICtrlCreateListViewItem($aProcessList[$i][0] & '|' & $aProcessList[$i][1], $ListView)
  57. Next
  58. $Button1 = GUICtrlCreateButton('OK', 36, 318, 80, 22)
  59. $Button2 = GUICtrlCreateButton('Отмена', 124, 318, 80, 22)
  60. ;Устанавливаем ширину по длине текста
  61. GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 0, -1)
  62.  
  63. GUISetState(@SW_SHOW)
  64.  
  65. While 1
  66.     Switch GUIGetMsg()
  67.         Case $Button1
  68.             $item = GUICtrlRead($ListView) ; Получить идентификатор (ID) текущего выделенного пункта ListView
  69.             If $item = 0 Then
  70.                 MsgBox(64 + 4096, "DontSleep", 'Ошибка: Ничего не выделено.', 0, $hGUI)
  71.             Else
  72.                 $text = GUICtrlRead($item, 1) ; Получить текст пункта ListView
  73.                 If $text == '' Then
  74.                     MsgBox(16 + 4096, "DontSleep", 'Ошибка при поиске инфо о пункте.', 0, $hGUI)
  75.                 Else
  76.                     ;Вытаскиваем из строки PID процесса
  77.                     $text = StringRegExpReplace($text, '^([^\|]+?\|)([0-9]{1,})\|$', '\2', 1)
  78.                     ;Чтобы не отключался/не переходил в спящий/ждущий
  79.                     _WinAPI_SetThreadExecutionState(BitOR($ES_SYSTEM_REQUIRED, $ES_CONTINUOUS))
  80.                     ;Чтобы не отключался экран:
  81.                     ;_WinAPI_SetThreadExecutionState(BitOR($ES_DISPLAY_REQUIRED, $ES_CONTINUOUS))
  82.                     $iTmp = 1
  83.                     GUISetState(@SW_HIDE)
  84.                     GUICtrlDelete($Button1)
  85.                     GUICtrlDelete($Button2)
  86.                     ;Регистрируем функцию проверки существования процесса
  87.                     AdlibRegister('__CheckProc', 1000)
  88.                     OnAutoItExitRegister('__Exit')
  89.                 EndIf
  90.             EndIf
  91.         Case $Button2
  92.             Exit
  93.         Case $GUI_EVENT_CLOSE
  94.             Exit
  95.     EndSwitch
  96. WEnd
  97.  
  98. Func __CheckProc()
  99.     If Not ProcessExists($text) Then
  100.         AdlibUnRegister('__CheckProc')
  101.         OnAutoItExitUnRegister('__Exit')
  102.         If $iTmp = 1 Then
  103.             ;Включаем обратно и завершаем скрипт
  104.             _WinAPI_SetThreadExecutionState($ES_CONTINUOUS)
  105.             $iTmp = 0
  106.         EndIf
  107.         Exit
  108.     EndIf
  109. EndFunc   ;==>__CheckProc
  110.  
  111. Func __Exit()
  112.     If $iTmp = 1 Then
  113.         ;Включаем обратно и завершаем скрипт
  114.         _WinAPI_SetThreadExecutionState($ES_CONTINUOUS)
  115.     EndIf
  116. EndFunc   ;==>__Exit
  117.  
  118. Func _WinAPI_SetThreadExecutionState($iFlags)
  119.     Local $Ret = DllCall('kernel32.dll', 'dword', 'SetThreadExecutionState', 'dword', $iFlags)
  120.     If (@error) Or (Not $Ret[0]) Then
  121.         Return SetError(1, 0, 0)
  122.     EndIf
  123.     Return $Ret[0]
  124. EndFunc   ;==>_WinAPI_SetThreadExecutionState
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement