Что нового

Автоматический запуск скрипта после нажатия ЗАВЕРШЕНИЯ РАБОТЫ

TERMINAL

Новичок
Сообщения
18
Репутация
1
Кто-нибудь может подсказать, что и где или как нужно сделать (прописать) в Windows XP, чтобы после нажатия ЗАВЕРШЕНИЯ РАБОТЫ выполнялся скрипт на наличие в CDROM диска (поиск по файлу) и открывал CDROM если же он там есть?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
TERMINAL
запрограммировать именно саму кнопку "Завершения работы" у меня в свое время не получилось. Но написать скрипт который делает то-то то-то и то-то и только потом выключается - раз плюнуть. Единственная проблема приучить себя выключать машину именно этим скриптом.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Kaster [?]
запрограммировать именно саму кнопку "Завершения работы" у меня в свое время не получилось
А не нужно эту кнопку программировать. Нужно отслеживать закрытие скрипта:

Код:
#include <WindowsConstants.au3>

GUICreate("Au3_Dummy")
GUIRegisterMsg($WM_CLOSE, "WM_CLOSE")
;~ OnAutoItExitRegister("OnExit")

While GUIGetMsg() <> -3
WEnd

Func WM_CLOSE($hWndGUI, $MsgID, $WParam, $LParam)
	OnExit()
EndFunc

Func OnExit()
	MsgBox(64, 'Title', 'Script is terminated.')
EndFunc
 

renom

Новичок
Сообщения
127
Репутация
2
Как писалось выше - такое не получалось...хоть я и нуб,но может быть с помощью команды ProcessWaitClose можно решить данную проблему?Судя по справочнику данная команда приостанавливает работу скрипта до тех пор пока не завершится указанный процесс.
Так вот этим самым указанным процессом должен служить тот,который первее всего завершается при выключении пк(какой это процесс - не знаю)

Может я в чем то не прав в этом вопросе?Прошу разъяснения :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
CreatoR [?]
А не нужно эту кнопку программировать. Нужно отслеживать закрытие скрипта:
а этот скрипт случаем не завершится не успев ничего сделать? к примеру моя винда не спрашивает что делать с программами, которые не завершились, а просто отрубает их
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Kaster [?]
моя винда не спрашивает что делать с программами, которые не завершились
По идее Windows отправляет всем программам сообщение WM_CLOSE при завершений работы, если программа на это не реагирует это её проблема, в нашем же случае мы ждём этого сообщения.
Я не проверял, но должно сработать.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
CreatoR
да. это стандартное поведение. именно в этом случае появляется сообщение что делать с такой программой - завершить насильно или ждать. так вот у меня отключены подобные сообщения :smile: но даже если и нет, то если скрипт не завершится по таймауту (мало ли какие там действия) то каждый раз будет появляться это назойливое сообщение. собственно, поэтому я и отключил его. поэтому я и предложил написать скрипт который при запуске делает нужные действия а потом отрубает комп. например, на моей старой работе комп был в домене который каждый раз при соединении с главным сервером следил чтобы в реестре было приветственное сообщение при загрузке. вот я и сделал скрипт который чистил реестр и только потом отрубал комп. повесил ярлык на раб стол и выключал или перегружал комп с него. это все же лучше чем держать в памяти лишний процесс
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Так, стоп. Объясняю по порядку. Во-первых, WM_CLOSE здесь непричем. При завершении работы, Windows посылает всем окнам WM_QUERYENDSESSION. Во-вторых, в AutoIt, как я обнаружил, разработчики это уже предусмотрели, и при любом раскладе будет вызвана функция OnAutoItExitRegister(). И в-третьих, обнаружение диска по поиску какого-либо файла на нем, может не сработать в данном случае, т.к. диск еще нужно раскрутить. А время-то идет... В Windows XP, по моему, по умолчанию дается 20 сек. на завершение приложений, в противном случае, они будут выгружены автоматически. Я предлагаю следующий способ обнаружения диска в CD-ROM'е:

Код:
#Include <WinAPIEx.au3>

OnAutoItExitRegister('_Quit')

_WinAPI_EmptyWorkingSet()

While 1
	Sleep(1000)
WEnd

Func _Quit()
	If _WinAPI_GetCDType('E:') Then
		CDTray('E:', 'open')
	EndIf
EndFunc   ;==>_Quit


А после вызова _WinAPI_EmptyWorkingSet() занимаемая процессом память снизится до ~500-600 KB.

На Windows 7 работает безупречно.

:smile:
 
Автор
T

TERMINAL

Новичок
Сообщения
18
Репутация
1
Всем спасибо ! Много полезных советов, но хотель бы :
1. Чтобы скрипт не висел постоянно в процессах, а вызывался только после нажатия ЗАВЕРШЕНИЯ РАБОТЫ.
2. Мне не нужно каждый раз открывать СDROM, нужно открыть в том случае если имеется определённый диск (поиск по файлу)...
Первый пункт меня больше интересует чем первый, а время на поиск и раскрутку диска у меня уходит 5 сек, может можно ещё что-то дописать...если поиск больше 15-20 сек (плохой СDROM или диск) то скрипт прекрощает свою работу и нетрогает СDROM.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
TERMINAL сказал(а):
Чтобы скрипт не висел постоянно в процессах, а вызывался только после нажатия ЗАВЕРШЕНИЯ РАБОТЫ.
Сделай следующее:

  • Создай .bat (.cmd) файл с вызовом твоей программы проверки диска:

    start "C:\Program Files\CDCheck\CDCheck.exe"

  • В диалоге "Run..." введи "gpedit.msc" и нажми OK.
  • Перейди в раздел "Computer Configuration\Windows Settings\Scripts (Startup/Shutdown)".
  • Щелкни два раза на "Shutdown".
  • Нажми "Add...", введи путь к созданному ранее .bat файлу и нажми OK - OK.

Теперь при завершении работы будет вызываться .bat файл, который в свою очередь запустит CDCheck.exe.

TERMINAL сказал(а):
Мне не нужно каждый раз открывать СDROM, нужно открыть в том случае если имеется определённый диск (поиск по файлу)...
Тогда лучше по DriveGetSerial().
 
Автор
T

TERMINAL

Новичок
Сообщения
18
Репутация
1
Спасибо, со всем разобрался, только не подскажешь как через RegWrite создать правильно запись в реестре вот такую :
REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Shutdown\0\0]
"ExecTime"=hex(b):00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00

Параметр REG_QWORD
При внесении RegWrite('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Shutdown\0\0','ExecTime',"REG_QWORD",'0x00000000000000000000000000000000')
нулей в ExecTime, по два нуля, 8 шт., а должно быть 16.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Я не знаю, что это такое, но есть Google...

:smile:
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
Код:
HotKeySet('!x', '_exit')

Func _exit()
	Exit
EndFunc

While 1
	Sleep(100)
	If WinExists('','В&ыключение') Then
		ControlDisable('','В&ыключение',20103) ; деактивируем Выключение. у меня ID кнопки выключения 20103.
		; тут можно узнать позиции всех контролов выключения
		; снять например скриншот окна выключения и создать свой с фоном скрина заменив своими кнопками
		;
		; извиняйте за нубо-код, предлагаю просто как концепцию
		;
		; может можно вообще как то заменить кнопку Выключения на вызов своего скрипта
		; не стал углублятся :)
	EndIf
WEnd



Добавлено:
Сообщение автоматически объединено:

не знаю как у других но у меня ID кнопки выключить всегда 20103 (OS XP SP3 Rus), проверить например, что это именно окно Выключения можно как класс+текст+id кнопки выключения.
 

aleratorio

Осваивающий
Сообщения
85
Репутация
42
Yashied сказал(а):
  • Создай .bat (.cmd) файл с вызовом твоей программы проверки диска:

    start "C:\Program Files\CDCheck\CDCheck.exe"

  • В диалоге "Run..." введи "gpedit.msc" и нажми OK.
  • Перейди в раздел "Computer Configuration\Windows Settings\Scripts (Startup/Shutdown)".
  • Щелкни два раза на "Shutdown".
  • Нажми "Add...", введи путь к созданному ранее .bat файлу и нажми OK - OK.

Теперь при завершении работы будет вызываться .bat файл, который в свою очередь запустит CDCheck.exe.
Написал и скомпилировал скрипт:
Код:
TrayTip('Выключение', 'ждите 50 секунд', 10)
Sleep(10000)
TrayTip('Выключение', 'ждите 40 секунд', 10)
Sleep(10000)
TrayTip('Выключение', 'ждите 30 секунд', 10)
Sleep(10000)
TrayTip('Выключение', 'ждите 20 секунд', 10)
Sleep(10000)
TrayTip('Выключение', 'ждите 10 секунд', 10)
Sleep(10000)
TrayTip('Выключение', 'Выключаюсь', 1)


кинул exe-шник в корень c:
создал script.bat:
Код:
c:\script.exe
(Start "c:\script.exe" у меня почему то вообще не срабатывает)

Сделал все что надо в gpedit.msc:

При нажатии "Завершение работы" комп выключился практически моментально, ничего не запустив...



Как все таки сделать, что бы при выключении компьютера, он запустил скрипт и дождался его завершения?

Garrett сказал(а):
aleratorio [?]
Да. Вариантов много. :smile:
(цитата из этой темы: http://autoit-script.ru/index.php?topic=4227.msg30783;topicseen#new)
 

JuniorSD

Новичок
Сообщения
1
Репутация
1
Команда в батнике должна выглядеть так:
Start /WAIT "c:\script.exe"
Иначе батник у тебя выполняется на запуск твоего файла но не дожидается его выполнения и закрывается. Винда в это время думает что скрипт выключения завершился и машину можно вырубить.
 

aleratorio

Осваивающий
Сообщения
85
Репутация
42
переделал на Start /wait c:\script.exe

Скрипт сработал :laugh:, только я сам скрипт изменил на:
Код:
for $i = 5 to 0 Step -1
	TrayTip('Выключение', 'ждите ' & $i*10 & ' секунд', 10)
	IniWrite('c:\script.ini', '', 'time' & $i, $i*10)
	Sleep(10000)
Next
TrayTip('Выключение', 'Выключаюсь', 1)
IniWrite('c:\script.ini', '', 'time', 'Выключаюсь')


В ini-файл все отлично сохраняет, а вот traytip-а я не увидел. Скрипт работает уже на фоне действия экрана "Завершение работы", экран висит время, которое выполняется скрипт. То есть никаких диалоговых окон и каких либо визуальных оповещений не увидеть. Только для задач типа копирования файлов, сохранения параметров и т.п.

Добавил в конец скрипта MsgBox(0, '','AAA'), так комп и завис на "Завершение работы", видимо где то невидимый MsgBox ждал нажатия OK, но ни одна клавиша, ни щелчки мышью не смогли достучаться до его кнопки... ...Пришлось жать Reset...
 

aleratorio

Осваивающий
Сообщения
85
Репутация
42
Теперь как бы это все:

Yashied сказал(а):
  • В диалоге "Run..." введи "gpedit.msc" и нажми OK.
  • Перейди в раздел "Computer Configuration\Windows Settings\Scripts (Startup/Shutdown)".
  • Щелкни два раза на "Shutdown".
  • Нажми "Add...", введи путь к созданному ранее .bat файлу и нажми OK - OK.
...проделать не заметно от пользователя, например как нибудь на уровне правки значений реестра.....
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Как автозагрузиться первым?

Sky-WaLkeR сказал(а):
Давно это интересовало, не подскажешь как это сделать (или хотя бы куда смотреть)?
Как ни странно, но смотреть нужно первым делом в справку, функция OnAutoItExitRegister(), макрос @ExitMethod...

:smile:

Если средствами Windows, то смотрите в gpedit.msc.
 
Верх