Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Сообщения: 903
Благодарности: 161

Профиль | Отправить PM | Цитировать


Creat0R, рано я обрадовался.. Обнаружил такой косячок:
если просто нажимаешь F8, то блокировка снимается;
если же сначала нажать Ctrl+Alt+Del, то потом жать на F8 бесполезно. Даже и не знаю, как это "объехать"...

Код:
Код: Выделить весь код
;Предотвращение появление процесса-клона
If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName)

;Блокирование ПК
#include <BlockInputEx.au3>
Opt("WinWaitDelay", 1)
$sTaskMgr_Title = "[CLASS:#32770;REGEXPTITLE:(Диспетчер задач|Task Manager)]"
;Disable Task Manager
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "1")

HotKeySet("{F8}", "_Quit") ; отработка функции _Quit при нажатии на F8

;Блокирует клавиатуру и мышь. Исключение - нажатие на клавишу F8
_BlockInputEx(1, "{F8}")

Func _Quit() ; задание самой функции _Quit (разблокирования)
	_BlockInputEx(0)
EndFunc

; в случае, если скрипт запускается из батника, то первый параметр ком . строки передаетс в $line (задаем время отработки прогресс-бара)
if $CmdLine[0] > 0 Then
    $line = $CmdLine[1]
Else
	;иначе идет считывание из finish.cmd времени отработки прогрессбара и передача этого значения в  переменную $line
    $line = FileReadLine(@ScriptDir & "\finish.cmd", 2)
EndIf


$iPID = Run(@COMSPEC & ' /c %SYSTEMDRIVE%\finish.cmd', "", @SW_HIDE)
While ProcessExists($iPID)
$Title = "Пожалуйста, подождите..."             ; Заголовок
$SubTitle = "Происходит финализация установки"  ; Суб-заголовок
$Message  = "После удаления мусора, оставшегося от установки" & @CRLF ; Сообщение. Записано в таком виде для удобства
$Message &= "XP и создания/перемещения ярлыков, Система" & @CRLF
$Message &= "будет перезагружена. Осталось времени: "

$Time = $line       ; Время здесь хранится в миллескундах. 1 с = 1000 мс

$Sleep = 0.01 * 100000    ; 10 мс. Меньше 1 мс ставить не рекомундуется. Впрочем, тут и 100 мс хватает.

$Timer = TimerInit() ; Инициализация таймера.

ProgressOn($Title, $SubTitle, $Message & $Time) ; Параметры: заголовок, суб-заголовок, сообщение. Включаем окно прогресса.
While TimerDiff($Timer) < $Time ; Пока прошло времени меньше чем нужно - повторять:
    ProgressSet(TimerDiff($Timer) / $Time * 100, $Message & Round(($Time - TimerDiff($Timer)) / 1000, 0) & " секунд")
    ; ProgressSet ( percent [, "subtext" [, "maintext"]] )
    ; Параметр 1: процент прогресса. Прошедшее время делим на требуемое и умножаем на 100
    ; Параметр 2: сообщение. Стандартное, как в перменной $Message плюс оставшееся время округлённое до целых
    ; Параметр 3: опциональный. Здесь не используется.
    Sleep($Sleep); Подожать $Sleep мс
WEnd
WEnd
ProgressSet(100, "ПЕРЕЗАГРУЗКА!  УДАЧНОЙ  РАБОТЫ!") ; Выводим последнее сообщение.
Sleep(3000) ; Чтобы было видно последнее сообщение.

;Enable Task Manager back
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "0")

; Функция самоудалениея скрипта 
#Include <File.au3>
Func _ScriptDestroy()
    $sTemp = _TempFile(@TempDir, '~', '.bat')
    $sPath = FileGetShortName(@ScriptFullPath)
    $hFile = FileOpen($sTemp, 2)
    FileWriteLine($hFile, '@echo off')
    FileWriteLine($hFile, ':loop')
    FileWriteLine($hFile, 'del ' & $sPath)
    FileWriteLine($hFile, 'if exist ' & $sPath & ' goto loop')
    FileWriteLine($hFile, 'del ' & $sTemp)
    FileClose($hFile)
    Run($sTemp, '', @SW_HIDE)
EndFunc   ;==>_ScriptDestroy

_ScriptDestroy()

Sleep(1000)
Shutdown(2)

-------
мы рождены, чтоб сказку сделать былью


Отправлено: 12:18, 03-08-2010 | #7