#NoTrayIcon ; не показывать иконку в трее
;защита от запуска двух копий
If WinExists("Zxh3vfjklfjk4lgf4kgf") Then Exit
AutoItWinSetTitle("Zxh3vfjklfjk4lgf4kgf")
; проверка версии ОС
If @OSVersion <> "WIN_XP" Then ; если не XP, то сообщаем и выходим
MsgBox (16, "Ошибка!", "Это приложение работает только на Windows XP")
Exit
EndIf
; Блокируем диспетчер задач и реестр, как сказал тут один человек.
RegWrite('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System', 'DisableTaskMgr', 'REG_DWORD', '1')
RegWrite('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System', 'DisableRegistryTools', 'REG_DWORD', '1')
$sTmpFile = @TempDir & "\MkXXov0P31CQq1o6SBsdw==.tmp" ; путь к файлу, который отслеживаем
$sMsgTxt = "Выключать компьютер в данный момент нельзя, так как к нему ещё подключены пользователи." & @CRLF _
& "Подождите, пока они закончат свою работу, или сообщите им, что Вы отключаетесь, потом повторите попытку."
$WM_QUERYENDSESSION = 0x0011 ; сообщение Windows о завершении работы
$FIRST_SHUTDOWN_RANGE = 0x03FF ; значение, наивысший приоритет на получение сообщения о завершении работы
$iMsgFlg = 0 ;флаг, который определяет показывать месаджбок или нет
$hGui = GUICreate ("shutdown_stop"); создаём гуй, который будет ловить сообщение
GUISetState (@SW_HIDE, $hGui); скрываем его, ибо он нам не нужен
GUIRegisterMsg ($WM_QUERYENDSESSION, "_Shutdown"); ожидаем сообщения от системы, и выполняем указанную функцию
_WinAPI_SetProcessShutdownParameters($FIRST_SHUTDOWN_RANGE); устанавливаем приоритет
While 1 ; бесконечный цикл, в ожидании сообщения.
Sleep(100); пауза, чтобы не грузить процесс
If $iMsgFlg = 1 Then _msgbox() ; если флаг стал равен 1, запускаем функцию отображения месаджа
WEnd
; наша функция, обрабатывающая сообщение
Func _Shutdown ($hWndGUI, $MsgID)
If FileExists ($sTmpFile) = 0 Then ; если файл не существует, то
Return 1 ; возвращаем 1, тоесть разрешаем завершение работы
EndIf
$hTmpFile = FileOpen ($sTmpFile, 0); открываем файл для чтения
$sTmpFileData = FileRead ($hTmpFile) ; читаем файл целиком
FileClose ($hTmpFile); закрываем файл
$iPos = StringInStr ($sTmpFileData, "f5kuDrmNRqJO0oTOMVUjhw=="); проверяем наличие строчки в тексте
If $iPos = 0 Then ; если строка не найдена, то выключать нельзя
Return 0 ; возвращаем 0
$iMsgFlg = 1 ; выставляем флаг месаджбокса 1, значит показать его
RegWrite('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System', 'DisableTaskMgr', 'REG_DWORD', '0')
RegWrite('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System', 'DisableRegistryTools', 'REG_DWORD', '0')
EndIf
; Далее я тут хочу создать файл Command.txt, где будет текст OffServer.
; Пробуем. Правда, я тут не совсем уверен, что здесь нет ошибок. Наверняка, их тут много. Я читал в русской справке, что при открытии файла для записи если его нет, то он будет автоматически создан.
$file = FileOpen("Command.txt", 1)
FileWriteLine($file, "OffServer")
FileClose($file)
; Ждём, пока моя программа завершит свою работу.
ProcessWaitClose("Start.exe")
; Теперь перед выходом разблокируем диспетчер задач и реестр.
RegWrite('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System', 'DisableTaskMgr', 'REG_DWORD', '0')
RegWrite('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System', 'DisableRegistryTools', 'REG_DWORD', '0')
Return 1 ; возвращаем один, значит выключать можно
EndFunc
; Может ещё что-то тут подправить?
; наша функция, отображающая месаджбокс
Func _msgbox()
MsgBox (48, "Сообщение от IntServer", $sMsgTxt)
$iMsgFlg = 0 ; после показа месаджа, выставляем флаг опять в ноль
EndFunc
; функция из библиотеки WinAPIEx_3.3 от Yashied
Func _WinAPI_SetProcessShutdownParameters($iLevel, $fDialog = 0)
Local $Ret = DllCall('kernel32.dll', 'int', 'SetProcessShutdownParameters', 'dword', $iLevel, 'dword', Not $fDialog)
If (@error) Or (Not $Ret[0]) Then
Return SetError(1, 0, 0)
EndIf
Return 1
EndFunc ;==>_WinAPI_SetProcessShutdownParameters