Что нового

Дополнительные функции для работы с реестром

Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
В первом случае - Unicode.

Код:
FileOpen($sFile, 2 + 32)
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Во втором случае FileClose("r.reg") вообще лишний.

:smile:
 

assch

Новичок
Сообщения
166
Репутация
4
Вот что с вашей большой помощью удалось сделать
Функция для снятия ключей реестра
За основу взял ваши функции.
Пришлось комбинировать снимать двумя способами.
Ваша функция отлично снимает ключи на ветки HKCR -13 секунд против 57 секунд.
А вот на остальных ветках отстаёт например ветку HKLM -17 секунд против 4 секунд.
Не беда как говорится одна голова хорошо а две лучше.
Не посмотрите на предмет оптимизации?

Код:
#Include <Constants.au3>            
#Include <WinAPIEx.au3>

Global $Array1,$Array2,$Array3,$Array4

$sReg = _RegExportEx('HKEY_CLASSES_ROOT')
FileWrite("HKCR.txt", $sReg)

_KeyList1("HKEY_CURRENT_USER")
FileWrite("HKCU.txt", "HKEY_CURRENT_USER" & @CRLF)
FileWrite("HKCU.txt", $Array1)

_KeyList2("HKEY_LOCAL_MACHINE")
FileWrite("HKLM.txt", "HKEY_LOCAL_MACHINE" & @CRLF)
FileWrite("HKLM.txt", $Array2)

_KeyList3("HKEY_USERS")
FileWrite("HKU.txt", "HKEY_USERS" & @CRLF)
FileWrite("HKU.txt", $Array3)

_KeyList4("HKEY_CURRENT_CONFIG")
FileWrite("HKCC.txt", "HKEY_CURRENT_CONFIG" & @CRLF)
FileWrite("HKCC.txt", $Array4)

Func _RegExportEx($sKey, $fAssurance = 0)
    Local $tData, $hRoot,$sReg = '', $Error = 1, $sRoot = $sKey
    $sKey = StringTrimLeft($sKey, StringLen($sRoot) + 1)
    Do
        $hRoot = _WinAPI_RegOpenKey(Eval($sRoot), $sKey, BitOR($KEY_ENUMERATE_SUB_KEYS, $KEY_QUERY_VALUE))
        If @error Then
            ExitLoop
        EndIf
        $tData = DllStructCreate('byte[1048576]')
        If Not _RegEnumProc($hRoot, StringRegExpReplace($sRoot & '\' & $sKey, '\\*\Z', ''), $fAssurance, $sReg, $tData) Then
            ExitLoop
        EndIf
        $Error = 0
    Until 1
    If $Error Then
        Switch @extended
            Case 0
                $Error = -1
            Case Else
                $Error = @extended
        EndSwitch
    EndIf
    If $hRoot Then
        _WinAPI_RegCloseKey($hRoot)
    EndIf
    If $Error Then
        Return SetError(2, $Error, '')
    EndIf
    
    Return $sReg
EndFunc  

Func _RegEnumProc($hRoot, $sRoot, $fAssurance, ByRef $sData, ByRef $tData, $sParam = 0)

    Local $hKey, $sKey, $sVal, $Pos, $Size, $Type
    Local $pData = DllStructGetPtr($tData)
    Local $Count = 0, $Error = 0

    If $sParam Then
        $sData &= $sRoot & '\' & $sParam  & @CRLF
    Else
        $sData = $sRoot  & @CRLF
    EndIf

    While 1
        $sKey = _WinAPI_RegEnumKey($hRoot, $Count)
        If @error Then
            Switch @extended
                Case 259 
                    ExitLoop
                Case Else
                    Return SetError(1, @extended, 0)
            EndSwitch
        EndIf
        $hKey = _WinAPI_RegOpenKey($hRoot, $sKey, BitOR($KEY_ENUMERATE_SUB_KEYS, $KEY_QUERY_VALUE))
        If @error Then
            If $fAssurance Then
                Return SetError(1, @extended, 0)
            EndIf
        Else
            If $sParam Then
                _RegEnumProc($hKey, $sRoot, $fAssurance, $sData, $tData, $sParam & '\' & $sKey)
            Else
                _RegEnumProc($hKey, $sRoot, $fAssurance, $sData, $tData, $sKey)
            EndIf
            If @error Then
                Switch @extended
                    Case 0
                        $Error = -1
                    Case Else
                        $Error = @extended
                EndSwitch
            EndIf
        EndIf
        If $hKey Then
            _WinAPI_RegCloseKey($hKey)
        EndIf
        $Count += 1
        If $Error Then
            ExitLoop
        EndIf
    WEnd
    If $Error Then
        Return SetError(1, $Error, 0)
    Else
        Return 1
    EndIf
EndFunc

Func _KeyList1($key)
$i = 1
While 1
$var = RegEnumKey($key, $i)
If @error <> 0 then ExitLoop 
$Array1 &= $key&"\"&$var & @CRLF
$i = $i + 1
_KeyList1($key&"\"&$var)             
WEnd   
EndFunc

Func _KeyList2($key)
$i = 1
While 1
$var = RegEnumKey($key, $i)
If @error <> 0 then ExitLoop 
$Array2 &= $key&"\"&$var & @CRLF
$i = $i + 1
_KeyList2($key&"\"&$var)             
WEnd   
EndFunc

Func _KeyList3($key)
$i = 1
While 1
$var = RegEnumKey($key, $i)
If @error <> 0 then ExitLoop 
$Array3 &= $key&"\"&$var & @CRLF
$i = $i + 1
_KeyList3($key&"\"&$var)             
WEnd   
EndFunc

Func _KeyList4($key)
$i = 1
While 1
$var = RegEnumKey($key, $i)
If @error <> 0 then ExitLoop 
$Array4 &= $key&"\"&$var & @CRLF
$i = $i + 1
_KeyList4($key&"\"&$var)             
WEnd   
EndFunc
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
assch сказал(а):
Ваша функция отлично снимает ключи на ветки HKCR -13 секунд против 57 секунд.
А вот на остальных ветках отстаёт например ветку HKLM -17 секунд против 4 секунд.

Я не знаю почему так происходит. Даже разработчики AutoIt ничего путного по этому поводу не смогли сказать. Остается использовать RegEnumKey() для перечисления разделов в тех ветвях, где _WinAPI_RegEnumKey() проигрывает. Но я думаю, что такое положение вещей будет иметь место только для перечисления разделов. Если перечислять переменные, то RegEnumVal(), будет значительно уступать _WinAPI_RegEnumValue().


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

По поводу оптимизации. Я советую тебе присмотреться к функции _WinAPI_RegQueryLastWriteTime(). Ее очень удобно использовать перед перечислением переменных в каждом разделе. Если любой параметр в опрашиваемом разделе изменится, будет удален или добавлен, то измениться соответственно и время последней модификации раздела. Чтобы лишний раз не перечислять переменные и считывать их значения, можно сравнить только времена модификаций. Это должно существенно повысить скорость сравнения снимков разделов реестра.
 

assch

Новичок
Сообщения
166
Репутация
4
Для этого как минимум нужно вытащить и записать значения последней модификации хотя бы ключей первой вложенности.
Кстати ключи первой вложенности любой ветки реестра можно вытащить и записать практически мнгновенно. Не исключено что такой метод повысит скорость выявления изменений в реестре. А вот как приспособить функцию _WinAPI_RegQueryLastWriteTime()
чтобы сделать список последней модификации этих ключей?
 

assch

Новичок
Сообщения
166
Репутация
4
Yashied

Есть функция RegNotifyChangeKeyValue
В твоей библиотеке WinAPIEx.au3 её нет. Не подскажешь как с ней работать?
По описанию и параметрам вроде бы тоже заточена для отслеживания изменений в реестре.
Не большое описание:
В недрах Windows существует одна маленькая API-функция, которая извещает вызвавшую ее программу об изменении определенного ключа. Вот ее описание:

LONG RegNotifyChangeKeyValue(HKEY hKey, BOOL bWatchSubtree, DWORD dwNotifyFilter, HANDLE hEvent, BOOL fAsynchronous);

Здесь hKey – это хэндл ключа реестра. В нашем случае это будет хэндл ключа HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. bWatchSubtree должен быть равен TRUE, если мы хотим следить не только за HKLM\...\Run, но и за всеми его подключами. dwNotifyFilter задает категорию изменений, при которых функция будет срабатывать. Для секции автозагрузки нам следует передать в этом параметре REG_NOTIFY_CHANGE_LAST_SET, вследствие чего мы будем мониторить только изменения параметров соответствующего ключа. hEvent – это хэндл объекта «событие», о котором я расскажу чуть позже. Последний параметр следует установить в TRUE, чтобы реагировать на событие. В случае удачного выполнения функция должна вернуть значение ERROR_SUCCESS.

Попробывал коряво её собрать но скорее всего не правильно.
Код:
#Include <WinAPIEx.au3>

$hKey = _WinAPI_RegOpenKey($HKEY_CLASSES_ROOT, ".djvu")
DllCall ( "Advapi32.dll", "int", "RegNotifyChangeKeyValue", "hwnd", $hKey, "int", TRUE, "int", 0x00000001, "int", FALSE, "int", TRUE)
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Там, откуда ты взял это описание, очень подробно рассказано, как работать с этой функцией. В AutoIt, использовать ее будет проблематично, т.к. не поддерживаются потоки. Скрипт будет все время в "зависшем" состоянии, ожидая изменений в реестре.
 

assch

Новичок
Сообщения
166
Репутация
4
Извини Yashied
Я просто думал что с её помощью тоже можно снять какие то данные и при втором заходе сравнить ,но если нельзя значит нельзя.
По твоему совету попробывал приспособить функцию _WinAPI_RegQueryLastWriteTime()
Посмотри пожалуйста может что то не так или что то лишнее.

Код:
#Include <WinAPIEx.au3>

$a = "HKEY_LOCAL_MACHINE"
Global $sData

_KeyList($a)
$Txt = FileOpen("1.txt",2)
FileWrite($Txt, $sData)
FileClose($Txt)

Func _KeyList($key)
$i = 1
While 1
$var = RegEnumKey($key, $i)
If @error <> 0 then ExitLoop 
$Array = $key&"\"& $var 
$w1 = StringInStr($Array,"\",0,1)
$w2 = StringTrimLeft($Array, $w1)
$hKey = _WinAPI_RegOpenKey($HKEY_LOCAL_MACHINE, $w2)
$tTime = _WinAPI_RegQueryLastWriteTime($hKey)
_WinAPI_RegCloseKey($hKey)
$sData &= $a & '\' & $w2 & '\' & DllStructGetData($tTime, 1) & @CRLF
$i = $i + 1
_KeyList($key&"\"&$var)             
WEnd   
EndFunc
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
assch сказал(а):
Есть функция RegNotifyChangeKeyValue()...

Немного поздно, но...

Код:
Global Const $REG_NOTIFY_CHANGE_NAME = 0x01
Global Const $REG_NOTIFY_CHANGE_ATTRIBUTES = 0x02
Global Const $REG_NOTIFY_CHANGE_LAST_SET = 0x04
Global Const $REG_NOTIFY_CHANGE_SECURITY = 0x08

; #FUNCTION# ====================================================================================================================
; Name...........: _WinAPI_RegNotifyChangeKeyValue
; Description....: Notifies the caller about changes to the attributes or contents of a specified registry key.
; Syntax.........: _WinAPI_RegNotifyChangeKeyValue ( $hKey, $iFilter [, $fSubtree [, $fAsync [, $hEvent]]] )
; Parameters.....: $hKey     - Handle to an open registry key. The key must have been opened with the KEY_NOTIFY access right.
;                              This handle is returned by the _WinAPI_RegCreateKey() or _WinAPI_RegOpenKey() function. It can also
;                              be one of the following predefined keys.
;
;                              $HKEY_CLASSES_ROOT
;                              $HKEY_CURRENT_CONFIG
;                              $HKEY_CURRENT_USER
;                              $HKEY_LOCAL_MACHINE
;                              $HKEY_USERS
;
;                  $iFilter  - Indicates the changes that should be reported. This parameter can be one or more of the following values.
;
;                              $REG_NOTIFY_CHANGE_NAME
;                              $REG_NOTIFY_CHANGE_ATTRIBUTES
;                              $REG_NOTIFY_CHANGE_LAST_SET
;                              $REG_NOTIFY_CHANGE_SECURITY
;
;                  $fSubtree - Specifies whether report changes in the subkeys of the specified key, valid values:
;                  |TRUE     - The function reports changes in the specified key and all its subkeys.
;                  |FALSE    - The function reports changes only in the specified key. (Default)
;                  $fAsync   - Specifies whether return immediately, valid values:
;                  |TRUE     - The function returns immediately and reports changes by signaling the specified event.
;                  |FALSE    - The function does not return until a change has occurred. (Default)
;                  $hEvent   - Handle to an event. If the $fAsync parameter is TRUE, the function returns immediately and changes are
;                              reported by signaling this event, otherwise this parameter is ignored.
; Return values..: Success   - 1.
;                  Failure   - 0 and sets the @error flag to non-zero, @extended flag may contain the system error code.
; Author.........: Yashied
; Modified.......:
; Remarks........: If the specified key is closed, the event is signaled. This means that an application should not depend on the
;                  key being open after returning from a wait operation on the event.
; Related........:
; Link...........: @@MsdnLink@@ RegNotifyChangeKeyValue
; Example........: Yes
; ===============================================================================================================================

Func _WinAPI_RegNotifyChangeKeyValue_($hKey, $iFilter, $fSubtree = 0, $fAsync = 0, $hEvent = 0)

    Local $Ret = DllCall('advapi32.dll', 'long', 'RegNotifyChangeKeyValue', 'ulong_ptr', $hKey, 'int', $fSubtree, 'dword', $iFilter, 'ptr', $hEvent, 'int', $fAsync)

    If @error Then
        Return SetError(1, 0, 0)
    Else
        If $Ret[0] Then
            Return SetError(1, $Ret[0], 0)
        EndIf
    EndIf
    Return 1
EndFunc   ;==>_WinAPI_RegNotifyChangeKeyValue

#Include <WinAPIEx.au3>

$hKey = _WinAPI_RegOpenKey($HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Run', $KEY_NOTIFY)
If _WinAPI_RegNotifyChangeKeyValue_($hKey, $REG_NOTIFY_CHANGE_LAST_SET) Then
    MsgBox(48, 'Registry', 'The registry hive has been modified.' & @CR & @CR & 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run')
EndIf
_WinAPI_RegCloseKey($hKey)


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

assch

Новичок
Сообщения
166
Репутация
4
Yashied не подскажешь какое значение можно подставить вместо фильтра $REG_NOTIFY_CHANGE_LAST_SET а то выдаёт ошибку
C:\Documents and Settings\??????\??????? ????\d.au3 (58) : ==> Variable used without being declared.:
If _WinAPI_RegNotifyChangeKeyValue_($hKey, $REG_NOTIFY_CHANGE_LAST_SET) Then
If _WinAPI_RegNotifyChangeKeyValue_($hKey, ^ ERROR
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Поправил. См. предыдущий пост.
 

assch

Новичок
Сообщения
166
Репутация
4
Yashied Отлично!!!
Попробывал свой торент поставить на авто загрузку. Скрипт среагировал мнгновенно.
Интересно если этот скрипт поставить на авто загрузку как ты думаешь он не сильно будет мешать виндам.
И ещё при запуске как и положено в трее виснет иконка, только как сделать чтобы можно было бы выключать
скрипт(а то если что гасить процесс из Диспетчера задач чуть чуть не удобно) А так просто изумительно.
Чуть доработать на предмет действий при срабатывании скрипта и одназначно это полезняшка.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Можно как-то так:

Код:
#NoTrayIcon

#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 3)
Opt('WinTitleMatchMode', 3)
Opt('WinWaitDelay', 0)

Global Const $REG_NOTIFY_CHANGE_NAME = 0x01
Global Const $REG_NOTIFY_CHANGE_ATTRIBUTES = 0x02
Global Const $REG_NOTIFY_CHANGE_LAST_SET = 0x04
Global Const $REG_NOTIFY_CHANGE_SECURITY = 0x08

Global $hKey, $tData

If ($CmdLine[0]) And ($CmdLine[1] = '-notify') Then
	$hKey = _WinAPI_RegOpenKey($HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Run', $KEY_NOTIFY)
	If _WinAPI_RegNotifyChangeKeyValue_($hKey, $REG_NOTIFY_CHANGE_LAST_SET) Then
		$tData = DllStructCreate('ulong_ptr;dword;ptr')
		For $i = 1 To 3
			DllStructSetData($tData, $i, 0)
		Next
		DllCall('user32.dll', 'lresult', 'SendMessage', 'hwnd', WinGetHandle('#RegHelper'), 'uint', $WM_COPYDATA, 'ptr', 0, 'ptr', DllStructGetPtr($tData))
	EndIf
	_WinAPI_RegCloseKey($hKey)
	Exit
EndIf

Global $hForm, $Msg, $ItemExit, $PID, $Notify = False

$hForm = GUICreate('#RegHelper')
GUIRegisterMsg($WM_COPYDATA, 'WM_COPYDATA')
$ItemExit = TrayCreateItem('Exit')
TraySetClick(8)
TraySetState()

$PID = Run(@ScriptFullPath & ' -notify')

While 1
	If $Notify Then
		$Notify = 0
		$PID = Run(@ScriptFullPath & ' -notify')
		Run(@AutoItExe & ' /AutoIt3ExecuteLine "MsgBox(48, ''Registry'', ''The registry hive has been modified.'', 5)"')
	EndIf
	$Msg = TrayGetMsg()
	Switch $Msg
		Case $ItemExit
			ProcessClose($PID)
			Exit
	EndSwitch
WEnd

Func _WinAPI_RegNotifyChangeKeyValue_($hKey, $iFilter, $fSubtree = 0, $fAsync = 0, $hEvent = 0)

    Local $Ret = DllCall('advapi32.dll', 'long', 'RegNotifyChangeKeyValue', 'ulong_ptr', $hKey, 'int', $fSubtree, 'dword', $iFilter, 'ptr', $hEvent, 'int', $fAsync)

    If @error Then
        Return SetError(1, 0, 0)
    Else
        If $Ret[0] Then
            Return SetError(1, $Ret[0], 0)
        EndIf
    EndIf
    Return 1
EndFunc   ;==>_WinAPI_RegNotifyChangeKeyValue

Func WM_COPYDATA($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case 0

		Case $hForm
			$Notify = 1
			Return 1
	EndSwitch
	Return 0
EndFunc   ;==>WM_COPYDATA


Только сначала откомпилируй его в .exe файл!

P.S

Если бы AutoIt поддерживал потоки, то все было бы намного проще...
 

assch

Новичок
Сообщения
166
Репутация
4
Интересно как можно при сигнале этого скрипта посмотреть что именно прописалось
ну и соответственно удалить непрошенную запись
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Последний скрипт можно написать проще (как-то я упустил это из виду):

Код:
#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)

Global $hKey, $hEvent

$hEvent = _WinAPI_CreateEvent()
$hKey = _WinAPI_RegOpenKey($HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Run', $KEY_NOTIFY)
If Not _WinAPI_RegNotifyChangeKeyValue($hKey, $REG_NOTIFY_CHANGE_LAST_SET, 0, 1, $hEvent) Then
	Exit
EndIf

While 1
	If Not _WinAPI_WaitForSingleObject($hEvent, 0) Then
		MsgBox(48, 'Registry', 'The registry hive has been modified.' & @CR & @CR & 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run')
		ExitLoop
	EndIf
	Sleep(100)
WEnd

_WinAPI_CloseHandle($hEvent)
_WinAPI_RegCloseKey($hKey)
 

assch

Новичок
Сообщения
166
Репутация
4
Yashied
Последний скрипт срабатывает хорошо.
Только когда закрываешь сигнальное окно, почему то зыкрывается сам скрипт.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
assch сказал(а):
Только когда закрываешь сигнальное окно, почему то зыкрывается сам скрипт.

Ну это просто пример. Вот:

Код:
#Include <NotifyBox.au3>
#Include <WinAPIEx.au3>

Opt('TrayAutoPause', 0)

Global Const $REG_NOTIFY_CHANGE_NAME = 0x01
Global Const $REG_NOTIFY_CHANGE_ATTRIBUTES = 0x02
Global Const $REG_NOTIFY_CHANGE_LAST_SET = 0x04
Global Const $REG_NOTIFY_CHANGE_SECURITY = 0x08

$hEvent = _WinAPI_CreateEvent()
$hKey = _WinAPI_RegOpenKey($HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Run', $KEY_NOTIFY)
If Not _WinAPI_RegNotifyChangeKeyValue($hKey, $REG_NOTIFY_CHANGE_LAST_SET, 0, 1, $hEvent) Then
	Exit
EndIf

While 1
	If Not _WinAPI_WaitForSingleObject($hEvent, 0) Then
		_NotifyBox(48, 'Registry', 'The registry hive has been modified.' & @CR & @CR & 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run', 5)
		If Not _WinAPI_RegNotifyChangeKeyValue($hKey, $REG_NOTIFY_CHANGE_LAST_SET, 0, 1, $hEvent) Then
			ExitLoop
		EndIf
	EndIf
	Sleep(100)
WEnd

_WinAPI_CloseHandle($hEvent)
_WinAPI_RegCloseKey($hKey)

Func _WinAPI_RegNotifyChangeKeyValue($hKey, $iFilter, $fSubtree = 0, $fAsync = 0, $hEvent = 0)

	Local $Ret = DllCall('advapi32.dll', 'long', 'RegNotifyChangeKeyValue', 'ulong_ptr', $hKey, 'int', $fSubtree, 'dword', $iFilter, 'ptr', $hEvent, 'int', $fAsync)

	If @error Then
		Return SetError(1, 0, 0)
	Else
		If $Ret[0] Then
			Return SetError(1, $Ret[0], 0)
		EndIf
	EndIf
	Return 1
EndFunc   ;==>_WinAPI_RegNotifyChangeKeyValue


NotifyBox.au3
 

assch

Новичок
Сообщения
166
Репутация
4
Yashied
Функция лежит в библиотеке WinAPIEx.au3?
А то последний скрипт без констант Global Const $REG_NOTIFY_CHANGE_LAST_SET = 0x04 не работает.
И в названии функции убери последнию чёрточку.
Func _WinAPI_RegNotifyChangeKeyValue_
А так отлично.
 

araneon

Новичок
Сообщения
59
Репутация
0
Yashied сказал(а):
assch сказал(а):
Только когда закрываешь сигнальное окно, почему то зыкрывается сам скрипт.

Ну это просто пример. Вот:

Код:
#Include <NotifyBox.au3>
#Include <WinAPIEx.au3>

Opt('TrayAutoPause', 0)

Global Const $REG_NOTIFY_CHANGE_NAME = 0x01
Global Const $REG_NOTIFY_CHANGE_ATTRIBUTES = 0x02
Global Const $REG_NOTIFY_CHANGE_LAST_SET = 0x04
Global Const $REG_NOTIFY_CHANGE_SECURITY = 0x08

$hEvent = _WinAPI_CreateEvent()
$hKey = _WinAPI_RegOpenKey($HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Run', $KEY_NOTIFY)
If Not _WinAPI_RegNotifyChangeKeyValue($hKey, $REG_NOTIFY_CHANGE_LAST_SET, 0, 1, $hEvent) Then
	Exit
EndIf

While 1
	If Not _WinAPI_WaitForSingleObject($hEvent, 0) Then
		_NotifyBox(48, 'Registry', 'The registry hive has been modified.' & @CR & @CR & 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run', 5)
		If Not _WinAPI_RegNotifyChangeKeyValue($hKey, $REG_NOTIFY_CHANGE_LAST_SET, 0, 1, $hEvent) Then
			ExitLoop
		EndIf
	EndIf
	Sleep(100)
WEnd

_WinAPI_CloseHandle($hEvent)
_WinAPI_RegCloseKey($hKey)

Func _WinAPI_RegNotifyChangeKeyValue($hKey, $iFilter, $fSubtree = 0, $fAsync = 0, $hEvent = 0)

	Local $Ret = DllCall('advapi32.dll', 'long', 'RegNotifyChangeKeyValue', 'ulong_ptr', $hKey, 'int', $fSubtree, 'dword', $iFilter, 'ptr', $hEvent, 'int', $fAsync)

	If @error Then
		Return SetError(1, 0, 0)
	Else
		If $Ret[0] Then
			Return SetError(1, $Ret[0], 0)
		EndIf
	EndIf
	Return 1
EndFunc   ;==>_WinAPI_RegNotifyChangeKeyValue


NotifyBox.au3


Подскажите пожалуйста, почему при запуске или при компиляции в консоли пишет

Код:
D:\test1.au3(8,44) : ERROR: $REG_NOTIFY_CHANGE_NAME previously declared as a 'Const'
Global Const $REG_NOTIFY_CHANGE_NAME = 0x01
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\test1.au3(9,50) : ERROR: $REG_NOTIFY_CHANGE_ATTRIBUTES previously declared as a 'Const'
Global Const $REG_NOTIFY_CHANGE_ATTRIBUTES = 0x02
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\test1.au3(10,48) : ERROR: $REG_NOTIFY_CHANGE_LAST_SET previously declared as a 'Const'
Global Const $REG_NOTIFY_CHANGE_LAST_SET = 0x04
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\test1.au3(11,48) : ERROR: $REG_NOTIFY_CHANGE_SECURITY previously declared as a 'Const'
Global Const $REG_NOTIFY_CHANGE_SECURITY = 0x08
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\test1.au3(32,95) : ERROR: _WinAPI_RegNotifyChangeKeyValue() already defined.
Func _WinAPI_RegNotifyChangeKeyValue($hKey, $iFilter, $fSubtree = 0, $fAsync = 0, $hEvent = 0)
 
Верх