Что нового

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

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
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,457
Репутация
186
Не понимаю зачем делать функцию EmergencyShutdown, если есть встроенная...
 
Автор
joiner

joiner

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