Что нового

Красивое выключение\перезагрузка ПК (или лаунчер)

sss

Продвинутый
Сообщения
332
Репутация
96
AutoIt: 3.3.6.1
Версия: 1.0

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

Описание: Данный скрипт позволяет красиво и быстро выключать/перезагружать ПК/загружать программы/файлы (при модификации). Принцип работы: на рабочий стол выводится ярлык скомпилированного скрипта, при запуске появляется небольшое полупрозрачное скругленное окно с галкой и крестом (данет). Да - совершается какое-то действие, нет - выход. Также прога закрывается если тыкнуть мышкой за ее пределами. Где бы вы не ставили ярлык, пункты будут видны. Делал для себя, решил выложить так как понравился результат :smile:

Код/Пример: Не запускайте без иконок - ПК выключится
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPIEx.au3>
#include <StaticConstants.au3>

$pos = MouseGetPos()

$gui_width = 88
$gui_height = 48

If @DesktopWidth - $pos[0] < $gui_width Then
	$x = @DesktopWidth - $gui_width - (@DesktopWidth - $pos[0])
Else
	$x = $pos[0]
EndIf
If @DesktopHeight - $pos[1] - 30 < $gui_height Then
	$y = @DesktopHeight - $gui_height - (@DesktopHeight - $pos[1])
Else
	$y = $pos[1]
EndIf


$hForm = GUICreate('OfficeRunner', $gui_width, $gui_height, $x, $y, $WS_POPUP)
_GuiRoundCorners($hForm, 0, 0, 30, 30)
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')
GUISetBkColor(0x000000)
_WinAPI_SetLayeredWindowAttributes($hForm, 0x000000, 0, $LWA_COLORKEY)

$hMain = GUICreate('', $gui_width, $gui_height, $x, $y, $WS_POPUP, $WS_EX_LAYERED, $hForm)
GUISetBkColor(0x000000)
$ok = GUICtrlCreateIcon(@ScriptDir & "\ok.ico", -1, 8, 8, 32, 32, BitOR($SS_NOTIFY, $WS_GROUP))
$no = GUICtrlCreateIcon(@ScriptDir & "\no.ico", -1, 48, 8, 32, 32, BitOR($SS_NOTIFY, $WS_GROUP))

_WinAPI_SetLayeredWindowAttributes($hMain, 0x000000, 0, $LWA_COLORKEY)

GUIRegisterMsg($WM_MOVE, 'WM_MOVE')

WinSetTrans($hForm, '', 0)
GUISetState(@SW_SHOW, $hForm)
For $i = 1 To 50 Step 5
	WinSetTrans($hForm, '', $i)
	Sleep(20)
Next
GUISetState(@SW_SHOW, $hMain)

AdlibRegister('my_ActiveParser', 100)

While 1
	$Msg = GUIGetMsg()
	Switch $Msg
		Case $ok
			Shutdown(1)
			Exit
		Case $no
			Exit
	EndSwitch
	Sleep(50)
WEnd

Func WM_MOVE($hWnd, $iMsg, $wParam, $lParam)
	WinMove($hMain, '', BitAND($lParam, 0xFFFF), BitShift($lParam, 16))
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOVE

Func _GuiRoundCorners($h_win, $i_x1, $i_y1, $i_x3, $i_y3)
	Dim $pos, $ret, $ret2
	$pos = WinGetPos($h_win)
	$ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long", $i_x1, "long", $i_y1, "long", $pos[2], "long", $pos[3], "long", $i_x3, "long", $i_y3)
	If $ret[0] Then
		$ret2 = DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $ret[0], "int", 1)
		If $ret2[0] Then
			Return 1
		Else
			Return 0
		EndIf
	Else
		Return 0
	EndIf
EndFunc   ;==>_GuiRoundCorners

Func WM_NCHITTEST($hWnd, $Msg, $wParam, $lParam)
    Return $HTCAPTION
EndFunc   ;==>WM_NCHITTEST

Func my_ActiveParser()
	If WinActive($hMain, '') = 0 Then
		If WinActive($hForm, '') = 0 Then Exit
	EndIf
	;or WinActive($hMain,'')=0
EndFunc   ;==>my_ActiveParser

Файл:
EXE+AU3+иконки,
отдельно иконки
Пример с запуском Office потерян - в ближайшее время напишу заново.
Снимок:
История версий:
Первый и последний релиз
18.03.2013 - небольшое исправление, перезалит на новый хостинг
Источник: http://autoit-script.ru/index.php?topic=5236
Автор(ы): Sky-WaLkeR
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Советую подготовить красивый PNG вместе с изображениями кнопок (все в одном PNG) и применить функцию _WinAPI_UpdateLayeredWindowEx(), там есть похожий пример. Факт нажатия на ту или иную кнопку лучше определять по координатам курсора мышки с помощью функции GUIGetCursorInfo(), вызывая ее в основном цикле. Потерю окном фокуса лучше определть с помощью WM_ACTIVATE:

Код:
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>

$hForm = GUICreate('MyGUI', 400, 400)
GUIRegisterMsg($WM_ACTIVATE, 'WM_ACTIVATE')
GUISetState()

Do
until GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_ACTIVATE($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hForm
			Switch BitAND($wParam, 0xFFFF)
				Case 0 ; WA_INACTIVE
					Exit
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_ACTIVATE


В функции WM_NCHITTEST достаточно написать следующее:

Код:
Func WM_NCHITTEST($hWnd, $Msg, $wParam, $lParam)
	Return $HTCAPTION
EndFunc   ;==>WM_NCHITTEST


+1 за старания и оформление.
 

joiner

Модератор
Локальный модератор
Сообщения
3,399
Репутация
595
Sky-WaLkeR
а может просто сделать в виде гаджета. чтобы при клике мышью не исчезал
 
Автор
sss

sss

Продвинутый
Сообщения
332
Репутация
96
Александр
Если закомментировать (или удалить) строчку AdlibRegister('my_ActiveParser',100) и функцию my_ActiveParser(), то исчезать не будет.
Yashied
Спасибо за советы, буду пробовать.
 

Astel064

Помог мой пост, ставь +!
Сообщения
271
Репутация
49
Уважаемый Sky-WaLkeR, не подскажите ли Вы, как это скачать с хостинга, который Вы использовали для заливки? :stars:
 
Автор
sss

sss

Продвинутый
Сообщения
332
Репутация
96
Astel064
Хостинг закрылся, ссылки битые...
Перезалил на свой хостинг, сделал маленькое исправление (в функции WM_NCHITTEST, как посоветовал Yashied, в ближайшее время воплощу и вторую половину его совета)
 

joiner

Модератор
Локальный модератор
Сообщения
3,399
Репутация
595
если запустить в папке, то при сворачивании папки сворачивается и окно программы. точнее, закрывается.
ну и

joiner [?]
чтобы при клике мышью не исчезал
 
Автор
sss

sss

Продвинутый
Сообщения
332
Репутация
96
Так это фича, а не баг. Смысл программы - запуск с ярлыка. Сделать неисчезающую версию (типа гаджета)?
 
Верх