Отcлеживание событий (Watch*)



WatchFile: "file_path"
WatchFileDelete: "file_path"

Слово WatchFile: срабатывает при появлении (создании) указанного файла и при каждом изменении содержимого этого файла.
Если указанный файл существует в момент старта nnCron, то задача сработает если файл изменился с того момента, когда пользователь выгрузил nnCron из памяти.

Слово WatchFileDelete: срабатывает при удалении (переименовании, перемещении) указанного файла.

Примеры:

WatchFile: "c:\flags\urgent.sem"
WatchFile: "c:\xxx\test.flg"
WatchFileDelete: "c:\flags\del.sem"
WatchFileDelete: "c:\xxx\xxx.flg"

Слова WatchFile:/WatchFileDelete: могут работать и с масками файлов, правда с одной оговоркой: они ищут в указанном каталоге первый подходящий по маске файл и только для первого найденного файла делают проверку на появление/изменение/удаление. Т. е. если в каталоге уже есть файл, удовлетворяющий заданной маске, то WatchFile:/WatchFileDelete: могут не сработать при появлении/изменении/удалении следующего, подпадающего под эту же маску файла.

Пример:

#( test_watchfile
WatchFile: "c:\xxx\*.sem"
Action:
    MSG: "flag detected"
)#

WatchDir: "dir_path" [flag] [modifiers]

Флаг (опционально):
WatchSubtree
Модификаторы (опционально):
WATCH-CHANGE-ATTRIBUTES - отслеживать изменение атрибутов
WATCH-CHANGE-DIR-NAME
- отслеживать изменение имени каталога
WATCH-CHANGE-FILE-NAME
- отслеживать изменение имени файла в каталоге
WATCH-CHANGE-LAST-WRITE
- отслеживать изменение даты последней записи (сработает при появлении нового файла или изменении уже существующего файла, но не сработает при удалении файла)
WATCH-CHANGE-SECURITY
- отслеживать изменение прав доступа
WATCH-CHANGE-SIZE
- отслеживать изменение размера

Срабатывает при изменениях в указанной директории. С помощью вышеуказанных модификаторов пользователь может тонко настраивать, какие именно параметры должны отслеживаться.

Флаг WatchSubtree позволяет мониторить не только указанный каталог, но и все его подкаталоги.

Примеры:

\ следим за всеми изменениями в 'c:\xxx'
WatchDir: "c:\xxx"

\ следим за изменением прав доступа к 'c:\xxx'
WatchDir: "c:\xxx"
WATCH-CHANGE-SECURITY

\ следим за изменением размера 'c:\xxx' 
\ и всех его подкаталогов
WatchDir: "c:\xxx"
WatchSubtree
WATCH-CHANGE-SIZE

\ следим за изменениями имен файлов, имен каталогов и
\ атрибутов в 'c:\xxx'
WatchDir: "c:\xxx"
WATCH-CHANGE-FILE-NAME
WATCH-CHANGE-DIR-NAME
WATCH-CHANGE-ATTRIBUTES

\ следим за изменениями имен файлов, имен каталогов и
\ атрибутов в 'c:\xxx' и всех его подкаталогах
WatchDir: "c:\xxx" WatchSubtree
WATCH-CHANGE-FILE-NAME
WATCH-CHANGE-DIR-NAME
WATCH-CHANGE-ATTRIBUTES

Если в качестве аргумента к слову WatchDir: указан отсутствующий каталог, то WatchDir: погружается в цикл ожидания его появления и периодически проверяет - не появился ли указанный каталог. Обнаружив появление каталога, слово WatchDir: срабатывает. Период между проверками в миллисекундах задаётся VALUE-переменной MonitorDirTimeout. Значение этой переменной по умолчанию - 60000 миллисекунд (60 секунд).


WatchConnect
WatchDisconnect

Срабатывает при установлении/разрыве интернет-соединения с провайдером. WatchConnect срабатывает также при старте nnCron, если в этот момент уже наличествует интернет-соединение.

Эти слова работают только в WinNT/2000/XP.


WatchClipboard: "text_pattern"

Срабатывает если содержимое буфера обмена подпадает под указанную маску.

В качестве text_pattern вы можете использовать традиционную маску (с применением символов * и ?) или регулярные выражения, заключив их в прямые слеши: /<regexp>/.

Примеры:

\ сработает при любых изменениях содержимого буфера обмена
WatchClipboard: "*"
\ сработает, если в буфер обмена скопировать имя какого-либо
\ исполняемого файла, например, 'nncron.exe'
WatchClipboard: "*.exe*"
\ сработает, если в буфер обмена скопировать текст,
\ содержащий число
WatchClipboard: "/.*\d+.*/"

WatchWinCreate: "win_pattern"
WatchWinActivate: "win_pattern"
WatchWinDestroy: "win_pattern"

Срабатывает при создании (отрытии)/активизации/удалении (закрытии) окна с указанным заголовком.

Пример:

#( test_watchwin
\ задача будет срабатывать
\ при появлении на экране окна пограммы 'Notepad',
\ при активизации окна браузера 'Opera'
\ и при закрытии окна браузер 'Internet Explorer
WatchWinCreate: "*Notepad"
WatchWinActivate: "Opera*"
WatchWinDestroy: "*Internet Explorer"
Action:
    \ ... выполняем работу
)# 

См. также примечание.


WatchWindow: "win_pattern"

Срабатывает при появлении окна с заголовком, подпадающим под образец и при смене этого заголовка на другой, подпадающий под маску.

Пример:

#( test_watchwindow
WatchWindow: "*white*"
Action:
    \ ... выполняем работу
)#

Разберем эту задачу подробнее. Мы задали маску окна (*white*), за которым cледим. Теперь, при появлении или любом изменении заголовка окна, в котором есть подстрока "white" WatchWindow: сработает. Например, WatchWindow: сработает при появление окна с заголовком 'white.txt - Notepad'. WatchWindow: сработает и при смене заголовка на 'black_and_white.txt - Notepad' (ведь в новом заголовке есть 'white'). При смене заголовка на 'black.txt - Notepad' WatchWindow: не сработает, поскольку в появившемся заголовке нет подстроки, за которой мы следим.

Выводы: если окно меняет свой заголовок и в новом заголовке нет заданной подстроки, то WatchWindow: не срабатывает. При возвращении первоначального заголовка (в котором эта подстрока присутствует), WatchWindow: сработает.

См. также примечание.


WatchDrive: <drv_letter>
WatchDriveRemove: <drv_letter>

Слова для работы с переносными носителями информации (переносными хард-дисками, USB-драйвами, CD/DVD-ROM приводами и т. д.).

Слово WatchDrive: cрабатывает при подключении к компьютеру переносного носителя (в момент появления указанной буквы диска в папке "Мой компьютер") или в момент закрытия лотка указанного CD/DVD-ROM привода.

Слово WatchDriveRemove: срабатывает при отключении переносного носителя (в момент удаления указанной буквы диска из папки "Мой компьютер") или в момент извлечения диска из указанного CD/DVD-ROM привода. Слово WatchDriveRemove: срабатывает также через некоторое время после закрытия пустого лотка CD/DVD-ROM привода, поскольку система попыталась считать диск и отрапортовала об его отсутствии.

В качестве аргумента для WatchDrive:/WatchDriveRemove: следует указывать букву нужного диска или маску * для работы со всеми дисками. После каждого срабатывания WatchDrive:/WatchDriveRemove: заполняется переменная %DRIVE-LETTER%, которая содержит букву подключенного/отключенного диска.

Пример:

#( test_watchdrive
WatchDrive: "E"
Action:
    START-APP: explorer.exe d:\backup
)#

#( test_watchdriveremove
WatchDriveRemve: "E"
Action:
    POWEROFF
)#

#( test_watchdrivemask
WatchDrive: "*"
Action:
    S" G" DRIVE-LETTER COMPARE 0=
    IF
        MSG: "drive G inserted"
    ELSE
        S" H" DRIVE-LETTER COMPARE 0=
        IF
            MSG: "drive H inserted"
        ELSE
            MSG: "unexpected drive (%DRIVE-LETTER%) inserted"
        THEN
    THEN
)#

Обратите внимание, что эти слова будут корректно работать с CD/DVD-ROM приводами только если в системе включена опция Autorun. В WinNT/2000/XP эта опция включается/выключается в реестре: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Cdrom.

См. также: CD-TRAY-EJECT: <drv_letter>, CD-TRAY-CLOSE: <drv_letter>, IS-CD-PRESENT: <drv_letter>


WatchEventLog: "log_name"

Срабатывает при обнаружении новых записей в журналах событий (event logs - WinNT/2000/XP). Это слово рассмотрено подробнее в соответствующем разделе.


WatchProc: "proc_pattern"
WatchProcStop: "proc_pattern"

Срабатывает при запуске/завершении указанного процесса. Обратите внимание, что слово WatchProc: (в отличие от WatchProcStop:) не допускает использование идентификатора процесса (PID) в качестве аргумента.

Пример:

#( test_proc
\ задача запустится и при старте 
\ и при завершении процесса 'wget.exe'
WatchProc: "wget.exe" 
WatchProcStop: "wget.exe"
Action:
    \ ... выполняем работу
)#

После применения слов WatchProc:/WatchProcStop: переменная %WATCH-PROC-ID% содержит строку с идентификатором "отловленного" процесса (PID).

Пример:

#( test_watchprocstop
WatchProc: notepad.exe
Action:
    MSG: "PID = %WATCH-PROC-ID%"
)#

WatchRegistryKey: "key_path" [flag] [modifiers]

Флаг (опционально):
WatchSubtree
Модификаторы (опционально):
REG-CHANGE-ATTRIBUTES - отслеживать изменение атрибутов ключа (таких, как security)
REG-CHANGE-NAME
- отслеживать изменение имени ключа
REG-CHANGE-LAST-SET - отслеживать изменение даты последней записи в ключ
REG-CHANGE-SECURITY
- отслеживать изменение прав доступа к ключу

Срабатывает при изменениях в указанном ключе реестра. С помощью вышеуказанных модификаторов пользователь может тонко настраивать, какие именно параметры должны отслеживаться.

Флаг WatchSubtree позволяет мониторить не только указанный ключ, но и все его подключи.

Примеры:

\ следим за всеми изменениями ключа
WatchRegistryKey: "HKEY_LOCAL_MACHINE\SOFTWARE\test"

\ следим за изменением прав доступа к ключу
WatchRegistryKey: "HKEY_LOCAL_MACHINE\SOFTWARE\test"
REG-CHANGE-SECURITY

\ следим за изменением имени ключа и всех его подключей
WatchRegistryKey: "HKEY_LOCAL_MACHINE\SOFTWARE\test"
WatchSubtree
REG-CHANGE-NAME

\ следим за изменениями имени ключа и прав доступа к ключу
WatchRegistryKey: "HKEY_LOCAL_MACHINE\SOFTWARE\test"
REG-CHANGE-NAME
REG-CHANGE-SECURITY

WatchLogoff: "username_pattern"
WatchLogon: "username_pattern"

Срабатывает (соответственно) при попытке закончить пользовательскую сессию и при логоне указанного юзера. Работает с масками имени пользователя.

Примеры:

WatchLogon: "vkondakov"
\ сработает при логоне юзера Admin и юзера Administrator
WatchLogon: "Admi*"
\ сработает при завершении сессии любым пользователем
WatchLogoff: "*"

WatchShutdown
WatchSuspend

Срабатывают при выключении компьютера (WatchShutdown) или переведении его в режим пониженного энергопотребления (WatchSuspend). Следует отметить, что nnCron не можнет остановить уже начавшийся процесс выключения или "усыпления" компьютера, поэтому "длинная" задача, запущенная по подобному событию, может не успеть выполниться. Спецификаторы события WatchShutdown и WatchSuspend создавались специально для коротких задач - например, взведения таймера, выбрасывание файл-флага.

Чтобы иметь возможность отменить выключение компьютера, отслеживайте опрос приложений перед выключением (WatchQueryShutdown).

См. также WatchQueryShutdown, WatchQuerySuspend, WatchLogoff:


WatchQueryShutdown

Срабатывает в момент опроса приложений перед тем как начнется процесс выключения компьютера. Слово WatchQueryShutdown удобно использовать тогда, когда нужно отследить и прервать попытку выключения компьютера.

См. также INTERCEPT-SHUTDOWN, CONTINUE-SHUTDOWN.


WatchQuerySuspend

Срабатывает в момент опроса приложений перед переведенем компьютера в режим "хибернейт" или режим пониженного энергопотребления.


WatchBatteryLow

Срабатывает при получении сообщения от системы о низком уровне зарядки аккумуляторов.


WatchResume
WatchResumeAuto

Срабатывают при возвращении в нормальный режим энергопотребления из спящего режима (Hibernate) или ждущего режима (StandBy).

При этом слово WatchResume срабатывает, когда компьютер возвращается в нормальный режим после действий пользователя (движение мыши, нажатие клавиши) - например, после StandBy и при обнаружении пользовательской активности сразу после возвращения из спящего режима (Hibernate).
WatchResumeAuto
срабатывает в случае "пробуждения" компьютера после StandBy и Hibernate вне зависимости от наличия или отсутствия действий пользователя.

Примеры:

#( test_watchresume
\ сработает при выходе из StandBy
\ и при первом пользовательском действии 
\ после выхода из Hibernate
WatchResume
Action:
    BEEP: 50 500
    PAUSE: 100
    BEEP: 50 500
)#

#( test_watchresumeauto
\ сработает при выходе из StandBy
\ и при выхода из Hibernate
WatchResumeAuto
Action:
    BEEP: 50 500
    PAUSE: 100
    BEEP: 50 500
)#

#( test_watchresumecombined
\ сработает один раз при выходе из StandBy
\ и два раза при выходе из Hibernate (сразу
\ после выхода и после начала пользовательской 
\ активности)
WatchResume
WatchResumeAuto
Action:
    BEEP: 50 500
    PAUSE: 100
    BEEP: 50 500
)#

WatchHotKey: "hotkey"

Срабатывет при нажатии указаного клавиатурного сокращения. В качестве клавиатурного сокращения имеет смысл использовать сочетание функциональных клавиш CTRL, SHIFT, ALT, WIN и одной из обычных буквенно-цифровых клавиш на вашей клавиатуре. Если указанное клавиатурное сокращение состоит из нескольких клавиш, то они считаются нажатыми вместе. Порядок указания клавиш и регистр "буквенных" клавиш не имеют значения (^@w и @W^ - это одно и то же)..
Коды клавиш подробно описаны здесь.

Примеры:

WatchHotKey: "$9"   \ 'WIN + 9'
WatchHotKey: "^@f"  \ 'CTRL + ALT + F'
WatchHotKey: "@+z"  \ 'ALT + SHIFT + Z'
WatchHotKey: "^+w"  \ 'CTRL + SHIFT + W'
WatchHotKey: "w^+"  \ 'CTRL + SHIFT + W' 

В качестве аргумента для слова WatchHotKey: можно использовать не только мнемонические коды клавиш, но и т. н. virtual key codes, которые можно узнать при помощи WinSpy. Виртуальные коды клавиш записываются в фигурных скобках.

Примеры:

WatchHotKey: "{0x74}"    \ 'F5'
WatchHotKey: "^@{0x7B}"  \ 'CTRL + ALT + F12'
WatchHotKey: "^+{0x47}"  \ 'CTRL + SHIFT + G'

Обратите внимание, что клавиши-модификаторы (CTRL, SHIFT, ALT, WIN) нельзя указывать в виде виртуальных кодов.


WTSWatchConnect
WTSWatchDisconnect
WTSWatchLock
WTSWatchLogoff
WTSWatchLogon
WTSWatchRemoteConnect
WTSWatchRemoteDisconnect

WTSWatchUnlock

Специальный набор Watch-слов для работы с Windows Terminal Services (WTS). Эти слова срабатывают при наступлении соответствующих событий:

WTS_CONSOLE_CONNECT    A session was connected to the console session.
WTS_CONSOLE_DISCONNECT A session was disconnected from the console session. 
WTS_REMOTE_CONNECT     A session was connected to the remote session. 
WTS_REMOTE_DISCONNECT  A session was disconnected from the remote session. 
WTS_SESSION_LOGON      A user has logged on to the session. 
WTS_SESSION_LOGOFF     A user has logged off the session. 
WTS_SESSION_LOCK       A session has been locked. 
WTS_SESSION_UNLOCK     A session has been unlocked 

После срабатывания любого из WTSWatch* слов, переменная WATCH-SESSIONID содержит номер SessionID.


Примечание: слова из группы WatchWin*: не реагируют на консольные окошки. Это ограничение, которое накладывает операционная система. При этом слово WIN-EXIST: корректно работает и с обычными, и с консольными окнами. Поэтому можно попробовать решить проблему отлавливания консольных окон с помощью периодического запуска WIN-EXIST:.


См. также: