Автор Тема: Дополнительные функции для работы с реестром  (Прочитано 29243 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Поправил. См. предыдущий пост.


Думай, прежде чем говорить.

Русское сообщество AutoIt

Re: Дополнительные функции для работы с реестром
« Ответ #30 Отправлен: Октябрь 26, 2010, 15:22:42 »

Оффлайн assch [?]

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

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Можно как-то так:

Код: AutoIt [Выделить]
#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 поддерживал потоки, то все было бы намного проще...
« Последнее редактирование: Октябрь 26, 2010, 18:01:03 от Yashied »

Оффлайн assch [?]

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

Русское сообщество AutoIt

Re: Дополнительные функции для работы с реестром
« Ответ #33 Отправлен: Октябрь 26, 2010, 23:29:22 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Последний скрипт можно написать проще (как-то я упустил это из виду):

Код: AutoIt [Выделить]
#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 [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Только когда закрываешь сигнальное окно, почему то зыкрывается сам скрипт.

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

Код: AutoIt [Выделить]
#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
« Последнее редактирование: Октябрь 30, 2010, 17:31:19 от Yashied »

Оффлайн assch [?]

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

Русское сообщество AutoIt

Re: Дополнительные функции для работы с реестром
« Ответ #37 Отправлен: Октябрь 30, 2010, 12:22:02 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Функция лежит в библиотеке WinAPIEx.au3?

Будет в следующей версии.

Оффлайн araneon [?]

  • Новичок
  • *
  • Сообщений: 59
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Только когда закрываешь сигнальное окно, почему то зыкрывается сам скрипт.

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

Код: AutoIt [Выделить]
#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



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

Код: AutoIt [Выделить]
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)

 

Нет ничего сложнее того, что выглядит и кажется простым

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Потому что в последней версии WinAPIEx.au3 эти константы уже присутствуют. Просто удали следующие строки:

Код: AutoIt [Выделить]
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


Оффлайн araneon [?]

  • Новичок
  • *
  • Сообщений: 59
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Ок, спасибо. И функцию тоже нужно было удалить ;)

Оффлайн araneon [?]

  • Новичок
  • *
  • Сообщений: 59
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
У меня тут вопросик маленький возник, только сильно не пинайте за тупость, просто я с инглишем не дружу, да и знаний в Autoit`e маловато  :'(
Подскажите, а как сделать, если мне нужно сохранить в файл несколько разных значений реестра, допустим

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer\Run


То есть нужно записать в файл ВСЕ, что храниться в каждой ветке, типа

===========================================================================
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]

"uTorrent"="\"C:\\Program Files\\uTorrent\\utorrent.exe\""
"USB Safely Remove"="C:\\Program Files\\USB Safely Remove\\USBSafelyRemove.exe /startup"
===========================================================================
и т.д
Вот как-то, так что бы получалось.

За ранее СПАСИБО!!!  ;) ;) ;)

Оффлайн BoaConstrictor-FENIX [?]

  • Новичок
  • *
  • Сообщений: 10
  • Репутация: 0
    • Награды
Доброго времени суток!
Попытался использовать функцию _RegEnumValues() из первого поста
(нажмите для показа/скрытия)


В итоге выдает в консоль
>"C:\Program Files\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Новая папка (6)\test13.au3"
C:\????? ????? (6)\test13.au3 (22) : ==> Variable used without being declared.:
$hKey = _WinAPI_RegOpenKey($HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall')
$hKey = _WinAPI_RegOpenKey(^ ERROR
>Exit code: 1    Time: 0.414

Добавил
#Include <APIConstants.au3>
и закоментировал строку
Global Const $REG_QWORD = 11

В итоге скрипт отрабатывается но массив на выходе состоит только из одной ячейки "1".

Подскажите где я туплю пожалуйста.

И заодно подскажите, эта функция значения параметров DWORD выводит в 16-ричном представлении или в 10-чном.

Заранее благодарен.



Версия Autoit 3.3.8.1
« Последнее редактирование: Март 03, 2014, 07:01:19 от BoaConstrictor-FENIX »

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2556
  • Репутация: 434
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
BoaConstrictor-FENIX
у тебя наверное винда х64, а ты скрипт запускаешь как х86(32-битный). у меня так же..запускаю как х86 - возвращает массив с 1. а если как х64, то возвращает массив значений
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Русское сообщество AutoIt

Re: Дополнительные функции для работы с реестром
« Ответ #44 Отправлен: Март 03, 2014, 14:48:15 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
16 Ответов
11779 Просмотров
Последний ответ Май 24, 2015, 00:16:05
от WSWR
5 Ответов
5123 Просмотров
Последний ответ Апрель 27, 2011, 15:15:41
от anonymous7
14 Ответов
8961 Просмотров
Последний ответ Март 21, 2011, 20:06:47
от Kalisnik
9 Ответов
4942 Просмотров
Последний ответ Март 09, 2011, 00:48:18
от JimmyN
6 Ответов
3103 Просмотров
Последний ответ Апрель 01, 2012, 13:29:22
от Garrett
0 Ответов
1705 Просмотров
Последний ответ Апрель 01, 2012, 00:16:10
от CreatoR
14 Ответов
12346 Просмотров
Последний ответ Март 21, 2014, 22:32:34
от Garrett
2 Ответов
3253 Просмотров
Последний ответ Сентябрь 27, 2013, 09:23:06
от black1
1 Ответов
818 Просмотров
Последний ответ Ноябрь 08, 2014, 21:52:13
от winstan
10 Ответов
2139 Просмотров
Последний ответ Декабрь 22, 2016, 10:03:04
от chaos-13