Что нового

Быстрое выключение\перезагрузка компьютера

joiner

Модератор
Локальный модератор
Сообщения
3 094
Репутация
518
AutoIt: 3.3.8.1

Категория: Разное

Описание: Быстрое выключение\перезагрузка компьютера под управлением Windows

Код/Пример:
Код:
#NoTrayIcon

#AutoIt3Wrapper_Icon=shut_re.ico
#AutoIt3Wrapper_Res_File_Add=shut_re.bmp,2,200

#include <GUIConstantsEx.au3>
#include "GUICtrlOnHover.au3"
#include <Icons.au3>

Opt("GUICloseOnESC", 0)
$Form1 = GUICreate("", 400, 150, -1, -1, $WS_POPUP, $WS_EX_TOPMOST)
$Pic = GUICtrlCreatePic('', -1, -1, 410, 160)
$hInstance = _WinAPI_GetModuleHandle(0)
$hBitmap = _WinAPI_LoadBitmap($hInstance, 200)
_SetHImage($Pic, $hBitmap)
_WinAPI_DeleteObject($hBitmap)
GUICtrlSetState(-1, $GUI_DISABLE)
$Button1 = GUICtrlCreateLabel("Выключение", 16, 16, 170, 25)
GUICtrlSetCursor(-1, 0)
GUICtrlSetTip(-1, 'Выключить компьютер')
_GUICtrl_OnHoverRegister(-1, "_Change_BG1", "_UnChange_BG1")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetFont(-1, 18, 800, 2, "MS Sans Serif")
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$Button2 = GUICtrlCreateLabel("Перезагрузка", 16, 100, 180, 25)
GUICtrlSetCursor(-1, 0)
GUICtrlSetTip(-1, 'Перезагрузить компьютер')
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetFont(-1, 18, 800, 2, "MS Sans Serif")
_GUICtrl_OnHoverRegister(-1, "_Change_BG2", "_UnChange_BG2")
$Button3 = GUICtrlCreateLabel("Отмена", 305, 65, 70, 18)
GUICtrlSetCursor(-1, 0)
GUICtrlSetTip(-1, 'Закрыть это окно')
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetFont(-1, 12, 800, 2, "MS Sans Serif")
_GUICtrl_OnHoverRegister(-1, "_Change_BG3", "_UnChange_BG3")
$Button4 = GUICtrlCreateLabel("Выход из системы", 16, 57, 245, 25)
GUICtrlSetCursor(-1, 0)
GUICtrlSetTip(-1, 'Завершить сеанс текущего пользователя')
_GUICtrl_OnHoverRegister(-1, "_Change_BG4", "_UnChange_BG4")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetFont(-1, 18, 800, 2, "MS Sans Serif")
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case -3
			Exit
		Case $Button1
			_EmergencyShutdown(2, 6)
		Case $Button2
			_EmergencyShutdown(1, 5)
		Case $Button4
			WTSLogoffSession()
		Case $Button3
			Exit
	EndSwitch
WEnd

Func _EmergencyShutdown($Shutdown_Reboot, $PowerActionShutdownOff)
	Local $hToken = _Security__OpenProcessToken(_WinAPI_GetCurrentProcess(), $TOKEN_ALL_ACCESS)
	If $hToken Then
		If _Security__SetPrivilege($hToken, $SE_SHUTDOWN_NAME, True) Then
			DllCall("ntdll.dll", "none", "NtShutdownSystem", "int", $Shutdown_Reboot)
			Local Const $PowerSystemShutdown = 6
			Local Const $SHTDN_REASON_FLAG_PLANNED = 0x80000000
			DllCall("ntdll.dll", "dword", "NtSetSystemPowerState", "int", $PowerActionShutdownOff, "int", $PowerSystemShutdown, "ulong", $SHTDN_REASON_FLAG_PLANNED)
			Return 1
		Else
			MsgBox(16 + 262144, "Ошибка!", "Недостаточно прав.")
		EndIf
		_WinAPI_CloseHandle($hToken)
	EndIf
	Return 0
EndFunc   ;==>_EmergencyShutdown

Func WTSLogoffSession()
	Local $hToken = _Security__OpenProcessToken(_WinAPI_GetCurrentProcess(), $TOKEN_ALL_ACCESS)
	If $hToken Then
		If _Security__SetPrivilege($hToken, $SE_SHUTDOWN_NAME, True) Then
			Local $aRet = DllCall('Wtsapi32.dll', 'BOOL', 'WTSLogoffSession', 'HANDLE', 0, 'DWORD', -1, 'BOOL', False)
			If @error Or Not IsArray($aRet) Or $aRet[0] = 0 Then Return SetError(1, 0, 0)
			Return $aRet[0]
		Else
			MsgBox(16 + 262144, "Ошибка!", "Недостаточно прав.")
		EndIf
		_WinAPI_CloseHandle($hToken)
	EndIf
	Return 0
EndFunc   ;==>WTSLogoffSession

Func _Change_BG1()
	GUICtrlSetColor($Button1, 0xFF0000)
EndFunc   ;==>_Change_BG1

Func _UnChange_BG1()
	GUICtrlSetColor($Button1, 0xFFFFFF)
EndFunc   ;==>_UnChange_BG1

Func _Change_BG2()
	GUICtrlSetColor($Button2, 0xFF0000)
EndFunc   ;==>_Change_BG2

Func _UnChange_BG2()
	GUICtrlSetColor($Button2, 0xFFFFFF)
EndFunc   ;==>_UnChange_BG2

Func _Change_BG3()
	GUICtrlSetColor($Button3, 0xFF0000)
EndFunc   ;==>_Change_BG3

Func _UnChange_BG3()
	GUICtrlSetColor($Button3, 0xFFFFFF)
EndFunc   ;==>_UnChange_BG3

Func _Change_BG4()
	GUICtrlSetColor($Button4, 0xFF0000)
EndFunc   ;==>_Change_BG4

Func _UnChange_BG4()
	GUICtrlSetColor($Button4, 0xFFFFFF)
EndFunc   ;==>_UnChange_BG4

Файл: AU3,EXE

Снимок:


Источник: autoit-script.ru
Автор(ы): joiner

Функция выключения\перезагрузки взята отсюда http://www.autoitscript.com/forum/topic/149641-how-to-force-a-power-down/page-2#entry1067754
 

alex33

Скриптер
Сообщения
1 453
Репутация
181
Не понимаю зачем делать функцию EmergencyShutdown, если есть встроенная...
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3 094
Репутация
518
alex33
приведи пример. сравни работу
 
Верх