Что нового

Оповещение системы об изменении в реестре

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Подскажите, пожалуйста, как оповестить систему о том, что произошли изменения в следующем ключе реестра:
[HKEY_CURRENT_USER\Control Panel\PowerCfg\GlobalPowerPolicy]

Признаком реакции можно считать изменение состояния соответствующих элементов управления в окне "Свойства: Электропитание"...
 

Rimm

Новичок
Сообщения
30
Репутация
0
Хотел напомнить о ранее размещенной теме
http://autoit-script.ru/index.php/topic,7279.msg49976.html#msg49976
Пусть меня забанят за повтор, но очень необходимо решение... и не только мне.
 

Microteam

Осваивающий
Сообщения
74
Репутация
34
Код:
$path = "HKCU\Control Panel\PowerCfg\GlobalPowerPolicy";

Dim $minidb[1];

For $i=1 To 50
$val  = RegEnumVal($path, $i);
If (@error<>0) Then ExitLoop

ReDim $minidb[$i];
$minidb[$i-1] = $val;
Next

While 1 
For $i=1 To 50
$val  = RegEnumVal($path, $i);
If (@error<>0) Then ExitLoop


if $minidb[$i-1] <> $val Then
MsgBox(48,"Test", "Обнаружены изменения!")
EndIf

Next
WEnd


Как такой вариант?
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Maalik
Дело в том, что ключ, который я привел в пример, я меняю сам, но без перезагрузки операционная система не желает замечать изменения, и в окне "Электропитание" изменения не отражаются...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Не могу вспомнить, но, по-моему, где-то Yashied приводил готовый пример на событие возникающие при изменении ветки реестра. Нужно поискать на форуме.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
Run(@ComSpec&' /K powercfg /q')

Не проще ли эти значения проверять на изменение? Насколько я понимаю, за электропитание отвечает несколько ключей в реестре.
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Хорошо... Постараюсь задать вопрос более конкретно: как сделать, например, чтобы при закрытии крышки ноутбука не происходил переход в ждущий режим?
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Что-то мне подсказывает, что у ноутбуков это "железная" особенность, и искать решение стоит в документации к буку или на сайте производителя. Можно ещё в биосе поглядеть.
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Garrett
Я ждал решения наподобие обновления кэша значков...
Самому мне не удалось видоизменить широковещательное сообщение...

Код:
; НАЧАЛО

; Обновление кэша значков

; Не сработало на WIN7

_RebuildShellIconCache()

Func _RebuildShellIconCache()
    Local Const $sKeyName = "HKCU\Control Panel\Desktop\WindowMetrics"
    Local Const $sValue = "Shell Icon Size"
    
    $sDataRet = RegRead($sKeyName, $sValue)
    If @error Then Return SetError(1)
    
    RegWrite($sKeyName, $sValue, "REG_SZ", $sDataRet + 1)
    If @error Then Return SetError(1)
    
    $bcA = _BroadcastChange()
    
    RegWrite($sKeyName, $sValue, "REG_SZ", $sDataRet)
    
    $bcB = _BroadcastChange()
    
    If $bcA = 0 Or $bcB = 0 Then Return SetError(1)
    
    Return
EndFunc ;==> _RebuildShellIconCache()

Func _BroadcastChange()
    Local Const $HWND_BROADCAST = 0xffff
    Local Const $WM_SETTINGCHANGE = 0x1a
    Local Const $SPI_SETNONCLIENTMETRICS = 0x2a
    Local Const $SMTO_ABORTIFHUNG = 0x2
    
    $bcResult = DllCall("user32.dll", "lresult", "SendMessageTimeout", _
        "hwnd", $HWND_BROADCAST, _
            "uint", $WM_SETTINGCHANGE, _
                "wparam", $SPI_SETNONCLIENTMETRICS, _
                    "lparam", 0, _
                        "uint", $SMTO_ABORTIFHUNG, _
                            "uint", 10000, _
                                "dword*", "success")
    If @error Then Return 0
    
    Return $bcResult[0]
EndFunc ;==> _BroadcastChange()

; КОНЕЦ
 

Arei

Скриптер
Сообщения
938
Репутация
115
вот значения реестра при закрытии крышки.
http://proffy.info/win7/2.htm
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Arei
Возможно, на WIN7 это сработает, не могу проверить, но на WINXP (по крайней мере без перезагрузки) не срабатывает...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
snoitaleR [?]
но на WINXP (по крайней мере без перезагрузки) не срабатывает...
Изменения в реестре вступают в силу сразу. Другое дело может ваша программа об этом не знает. :scratch:
IMHO перезагрузка нужна для того, чтобы система (на стадии старта) загрузила компоненты, (драйвера и т.д.) по записям в реестре.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626

Yashied

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

XP

Код:
#Include <APIConstants.au3>
#Include <GUIConstantsEx.au3>

Global Const $PBT_APMQUERYSUSPEND = 0
Global Const $BROADCAST_QUERY_DENY = 0x424D5144

$hForm = GUICreate('')
GUIRegisterMsg($WM_POWERBROADCAST, 'WM_POWERBROADCAST')

While 1
	Sleep(1000)
WEnd

Func WM_POWERBROADCAST($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hForm
			Switch $wParam
				Case $PBT_APMQUERYSUSPEND
					Return $BROADCAST_QUERY_DENY
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_POWERBROADCAST


Vista+

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

_WinAPI_SetThreadExecutionState(BitOR($ES_CONTINUOUS, $ES_SYSTEM_REQUIRED, 
$ES_AWAYMODE_REQUIRED))

...

_WinAPI_SetThreadExecutionState($ES_CONTINUOUS)
 
Верх