Page 1 sur 1

[R] Ecrire dans le registre le contenu d'un fichier texte

Posté : ven. 19 oct. 2007 19:35
par Vins83
Salut à tous !!

Voilà mon probleme que je rencontre pour mes programmes..
La durée de ceux ci peu durer de 10 minutes a des heures et le probleme est que si la mise en veille prolongé est activé,l'opération ne peu se finir donc:

Je crée une sauvegarde des parametres étant sur l'ordinateur:

Code : Tout sélectionner

FileDelete ( " Désactiver la mise en veille prolongée.txt " )
$file = FileOpen ( " Désactiver la mise en veille prolongée.txt " , 1 )
$var = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power " , " Heuristics " )
FileWrite ( $file , ' " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power " ' )
FileWrite ( $file , ' , " Heuristics " ' )
FileWrite ( $file , ' , " ' & $var & ' " ' & @CRLF )
$var1 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power " , " Heuristics " )
FileWrite ( $file , ' " HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power " ' )
FileWrite ( $file , ' , " Heuristics " ' )
FileWrite ( $file , ' , " ' & $var1 & ' " ' & @CRLF )
FileClose ( $file )


ensuite il faut bien sur que je supprime ces valeurs pour désactiver la mise en veille:

Code : Tout sélectionner

; Supprime la mise en veille prolongé
RegDelete ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power " , " Heuristics " )
RegDelete ( " HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power " , " Heuristics " )


Maintenant une fois que mon programme c'est fini,il faut que je remette les parametre a l'identique (plutot logique),et c là que je rame....

Que faire?

Lire le texte et copier le contenu dans le registre?

Si vous avez une idée,je suis preneur..

Posté : sam. 20 oct. 2007 10:31
par sylvanie
Salut,

ta question est étonante, car elle comporte déjà la réponse ...
oui effectivement je ferai ainsi.

du moins il faut prendre un moyen de stockage physique comme tu le fait (écriture en fichier), mais surtout pas en variable en RAM durant la vie du programme, car si ta machine à une coupure ou ton programme reçoit un kill-9, on aura perdu le contenu de ces clés.

Si le fichier text paraît dérangenant, on peux utiliser à la place une clé de registre en backup pour chacune de celles qui vont se faire détruiure. Par exple créer HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power\Heuristics_bckup et l'autre calée sur le même modèle

pour la restauration de fin par contre, je suggère de l'inclure dans une fonction de sortie:

Code : Tout sélectionner

autoitsetoption("Onexitfunc","My_Exit")

ton prog


func My_Exit()
   recopie des backup vers les vraie clé
   destruction des backup
Endfunc
du coups, si ton programme est arrêté autrement que par un kill 9 ou une coupure de courrant, tu es sûr que la restauration du backup est éxécutée (même en cas de reboot anormale de la machine)

Posté : sam. 20 oct. 2007 14:11
par Tlem
Personnellement, je préfèrerais la sauvegarde des paramètres dans un fichier .reg, puis la mise en place d'une valeur de remise en place de la sauvegarde dans la clé RunOnce (en cas de Kill9, coupure EDF ...).
[codee=reg][HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx][/codee]


Si le prog s'exécute correctement, remise en place des valeurs sauvegardées, puis suppression de la clé RunOnce.

La remise en place des valeurs sera effectuée par un simple :

Code : Tout sélectionner

regedit  /S SAV.reg
Voici le format d'un fichier .reg :

Code : Tout sélectionner

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power]
"Heuristics"=hex:05,00,00,00,00,01,01,00,74,9d,00,00,f0,00,00,00,a7,00,00,00

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power]
"Heuristics"=hex:05,00,00,00,00,01,01,00,74,9d,00,00,f0,00,00,00,a7,00,00,00
 
Pour info, il est possible de supprimer des valeurs de base de registre comme ceci :

Code : Tout sélectionner

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power]
"Heuristics"=-

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power]
"Heuristics"=-
PS : Pour information, sur un de mes PC, la clé HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001 n'existe pas.
Par contre, j'ai les clés :
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003

et
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet004
dans lesquelles on retrouve la valeur ...Control\Session\Manager\Power\Heuristics

Posté : lun. 22 oct. 2007 06:32
par Vins83
ON va dire que c'est résolu de cette maniere,mais si je trouve mieux,je posterais a nouveau:

Code : Tout sélectionner

_sauvegardemiseenveilleprolonge ( )
; fonction sauvegarder le registre de Désactiver la mise en veille prolongée
Func _sauvegardemiseenveilleprolonge ( )
If Not IniReadSection ( " lang.ini " , " Settings " ) = 0 Then
$file = FileOpen ( " lang.ini " , 1 )
FileWrite ( $file , @CRLF & " [Settings] " & @CRLF )
$var0 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power " , " Heuristics " )
FileWrite ( $file , " 0 = " & $var0 & @CRLF )
$var1 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power " , " Heuristics " )
FileWrite ( $file , " 1 = " & $var1 & @CRLF )
$var2 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Session Manager\Power " , " Heuristics " )
FileWrite ( $file , " 2 = " & $var2 & @CRLF )
$var3 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Control\Session Manager\Power " , " Heuristics " )
FileWrite ( $file , " 3 = " & $var3 & @CRLF )
$var4 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet004\Control\Session Manager\Power " , " Heuristics " )
FileWrite ( $file , " 4 = " & $var4 & @CRLF )
FileClose ( $file )
EndIf
EndFunc ; == >_sauvegardemiseenveilleprolonge
RegDelete ( " HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power " , " Heuristics " )
RegDelete ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power " , " Heuristics " )
RegDelete ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Session Manager\Power " , " Heuristics " )
RegDelete ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Control\Session Manager\Power " , " Heuristics " )
RegDelete ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet004\Control\Session Manager\Power " , " Heuristics " )
_reinstallerlamiseenveilleprolonge ( )
; fonction reinstaller la mise en veille prolongé
Func _reinstallerlamiseenveilleprolonge ( )
RegWrite ( " HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power " , " Heuristics " , " REG_BINARY " , IniRead ( " lang.ini " , " Settings " , " 0 " , " " ) )
RegWrite ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power " , " Heuristics " , " REG_BINARY " , IniRead ( " lang.ini " , " Settings " , " 1 " , " " ) )
RegWrite ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Session Manager\Power " , " Heuristics " , " REG_BINARY " , IniRead ( " lang.ini " , " Settings " , " 2 " , " " ) )
RegWrite ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Control\Session Manager\Power " , " Heuristics " , " REG_BINARY " , IniRead ( " lang.ini " , " Settings " , " 3 " , " " ) )
RegWrite ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet004\Control\Session Manager\Power " , " Heuristics " , " REG_BINARY " , IniRead ( " lang.ini " , " Settings " , " 4 " , " " ) )
EndFunc ; == >_reinstallerlamiseenveilleprolonge

Posté : mar. 23 oct. 2007 06:56
par Tlem
Pourquoi faites vous 6 accès au fichier, alors qu'un seul suffit ?

Code : Tout sélectionner

If Not IniReadSection ( " lang.ini " , " Settings " ) = 0 Then
$var0 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power " , " Heuristics " )
$var1 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power " , " Heuristics " )
$var2 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Session Manager\Power " , " Heuristics " )
$var3 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Control\Session Manager\Power " , " Heuristics " )
$var4 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet004\Control\Session Manager\Power " , " Heuristics " )
$file = FileOpen ( " lang.ini " , 1 )
FileWrite ( $file , " [Settings] " & @CRLF & " 0 = " & $var0 & @CRLF & " 1 = " & $var1 & @CRLF & " 2 = " & $var2 & " 3 = " & $var3 & @CRLF & " 4 = " & $var4 & @CRLF )
FileClose ( $file )
EndIf
Ce code ne peut fonctionner à cause des espaces parasites dans le chemin de clé et le nom de la clé ("Heuristique").

De plus, si la clé n'existe pas sur la machine hôte, ce qui est mon cas pour ControlSet001, la valeur de retour, sera vide, et donc lors de la remise en place des clés, ControlSet001 sera créer mais ne contiendra rien !!!

Un exemple d'optimisation donnerait :

Code : Tout sélectionner

If Not IniReadSection ( "lang.ini" , "Settings" ) = 0 Then
Dim $SKey = "Heuristics" , $var = "[Settings]" & @CRLF
$var0 = RegRead ( " HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power " , $SKey )
If $var0 <> " " Then $var & = " 0 = " & $var0 & @CRLF
$var1 = RegRead ( " HKLM\SYSTEM\ControlSet001\Control\Session Manager\Power " , $SKey )
If $var1 <> " " Then $var & = " 1 = " & $var1 & @CRLF
$var2 = RegRead ( " HKLM\SYSTEM\ControlSet002\Control\Session Manager\Power " , $SKey )
If $var2 <> " " Then $var & = " 2 = " & $var2 & @CRLF
$var3 = RegRead ( " HKLM\SYSTEM\ControlSet003\Control\Session Manager\Power " , $SKey )
If $var3 <> " " Then $var & = " 3 = " & $var3 & @CRLF
$var4 = RegRead ( " HKLM\SYSTEM\ControlSet004\Control\Session Manager\Power " , $SKey )
If $var4 <> " " Then $var & = " 4 = " & $var4 & @CRLF
$file = FileOpen ( "lang.ini" , 1 )
FileWrite ( $file , $var )
FileClose ( $file )
EndIf
Edit : Je vois qu'en fait, c'est ForumColor qui rajoute les espaces indésirables ...
Aller hop, un ptit post là ou il faut.

Posté : mar. 23 oct. 2007 13:50
par ani
y a surement une petite commande sous dos qui permet de stopper la mise en veuille prolongé (c'est un élément du panneau des options d'alimentation) comme je te l'avait signalé vins, mais vu que de mon coté je débute... je ne pourrait fournir une réponse pour cette fois-ci..

Posté : mar. 23 oct. 2007 22:40
par Tlem
Bien vu ani.

En cherchant un peut avec Google, j'ai trouvé ceci :
powercfg -h off Pour désactiver la mise en veille prolongée.
powercfg -h on Pour la réactivée.

Et ceci pour la mise en veille tout cours : http://www.laboratoire-microsoft.org/t/23215/

Sinon, encore mieux :

Code : Tout sélectionner

Powercfg -h off
Powercfg /setactive "Toujours actif"
Le nom du schéma en cours peut être récupérer de 2 manières :

Code : Tout sélectionner

Powercfg -q
Mais il faudra filtrer le résultat (4iem ligne)

Ou alors plus simple :
Lecture de la valeur [HKEY_CURRENT_USER\Control Panel\PowerCfg]
"CurrentPowerPolicy"="1"

qui renvoie sur :
[HKEY_CURRENT_USER\Control Panel\PowerCfg\PowerPolicies\1]
"Name"="Ordinateur portable"


PS: j'ai tenté de modifier directement dans la base de registre : CurrentPowerPolicy
Mais ca ne fonctionne pas ...
Il faut donc passer par la commande Powercfg

Posté : mar. 23 oct. 2007 23:39
par Vins83
je vais essayer de passer ça par un run ou un truc du genre,j'ai pas encore eu le temps de tester

run ("powercfg -h off")

Posté : ven. 26 oct. 2007 10:20
par sergio
hello une petite precision sur l'utilisation de la base de registre.
la clé qui est lue lors du l'execution du systeme est dans la partie CurrentControlSet

les autres CurrentControlSet 1,2,3 sont des sauvegardes et par consequent ne sont pas lues.
Donc tu peux alleger ton script en ne mentionant pas ces clés (meme si un copié collé est rapide)

Posté : ven. 26 oct. 2007 22:06
par Tlem
Merci de cette précision sergio.

Cela permet effectivement d'alléger le code, et l'exécution de celui-ci.

Posté : ven. 26 oct. 2007 22:55
par Vins83
Merci pour ta réponse sergio,sa fait bien avancé mon chimiliblique..

Posté : dim. 28 oct. 2007 10:02
par ani
y a surement une solution moins hardu

solution 1 : changer le temp de x minute en jamais et reinitialiser en fin de programme
solution 2 : ajouter le programme dans les composant de réveil

ou trouver la manière qu'utilise win lors d'un installation ou d'un soft de scanviri il met en veille la machine et pourtant il continu son opération ? non ?


vu que je me suis levé tot je vais chercher un peu .

Posté : dim. 30 déc. 2007 18:19
par arrkhan
je déterre car je me suis retrouvé confronté au problème et je l'ai résolu....

la valeur a regarder est bien: HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power\Heuristics.
mais il ne faut s'interresser qu'aux 16 premier octets et les récupérer comme suit: StringLeft(RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power", "Heuristics"), 16)

sous XP Pro, Home et Win 2000, 0500000000010000 indique que la mise en veille est inactive et 0500000000010100 qu'elle est activée.

Sous Vista, la mise en veille prolongée est activée par défaut et la donnée est 0600000000010100, je ne peux pas la désactiver (émulation VPC07) mais on peut légitimement pensé qu'il s'agit de 0600000000010000.

il suffit donc de récupérer les données pour voir si la veille prolongée est active ou non et utiliser le "powercfg /h ...." approprié.

/!\ Attention, sous Vista, il faudra avoir les droits "Super Administrateur" pour utiliser "powercfg /h ..." avec #RequireAdmin.