IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

[Windows 10][OS 64] Modifier une clé de registre


Sujet :

Langage Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut [Windows 10][OS 64] Modifier une clé de registre
    Bonjour,

    une fois n'est pas coutume, je veux modifier par programme, une clé de registre.

    Objectif : changer la voix de synthèse au runtime

    pour cela j'ai :
    1- récupéré la voix par défaut
    2- récupéré la liste des voix disponibles

    vous excuserez le code pas très propre, ce n'est encore qu'un brouillon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    const 
     DefaultHKU = 'Software\Microsoft\Speech_OneCore\Settings\TextToSpeech';
     
    procedure TForm117.Button2Click(Sender: TObject);
    var r : TRegistry;
        sl : TStringList;
     
        Voix,K : String;
     
    const tokens = 'SOFTWARE\Microsoft\Speech_OneCore\Voices\Tokens';
    begin
      r:=TRegistry.Create(KEY_READ OR KEY_WOW64_64KEY);
      sl:=TStringList.Create;
      r.RootKey:=HKEY_CURRENT_USER;
      R.OpenKeyReadOnly(DefaultHKU);
      Voix:=R.ReadString('Voice');
      rvoice:=Voix;
      memo1.Lines.Add(rvoice);
      r.CloseKey;
     
      r.RootKey:=HKEY_LOCAL_MACHINE;
      R.OpenKeyReadOnly(tokens);
      r.GetKeyNames(Sl);
      R.CloseKey;
      for var t in Sl do
        begin
          k:=Format('%s\%s',[tokens,t]);
          r.OpenKeyReadOnly(k+'\Attributes');
          Combobox1.Items.AddObject(R.ReadString('Name'),TVoice.Create(R.ReadString('Name'),'HKEY_LOCAL_MACHINE\'+k));
          r.CloseKey;
        end;
      ComboBox1.ItemIndex:=Sl.IndexOf(ExtractFileName(voix));
      FreeAndNil(R);
      FreeAndNil(sl);
    end;
    Cette partie là fonctionne

    Voilà le problème : comment modifier le registre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    procedure TForm117.ComboBox1Change(Sender: TObject);
    var R : TRegistry;
    begin
    if RVoice<>TVoice(Combobox1.Items.Objects[ComboBox1.ItemIndex]).Fichier then
     begin
      r:=TRegistry.Create(KEY_WOW64_64KEY);
      r.RootKey:=HKEY_CURRENT_USER;
      r.OpenKey(DefaultHKU,false);
      r.WriteString('Voice',TVoice(Combobox1.Items.Objects[ComboBox1.ItemIndex]).Fichier);
      r.CloseKey;
      Memo1.Lines.Add(TVoice(Combobox1.Items.Objects[ComboBox1.ItemIndex]).Fichier);
      FreeAndNil(r);
    end;
    end;
    Problème j'obtiens une exception de type ERegistryException avec le message 'Echec à la définition des données pour 'Voice'' !

    Questions :
    a) j'ai un doute sur la création du TRegistry avec "seulement" le KEY_WOW64_64KEY en ajoutant KEY_WRITE OR KEY_WOW64_64KEY, plus d'erreur
    b) un doute sur la mise à jour sans avoir besoin d'exécuter le programme en mode administrateur (besoin d'un manifeste?) (a priori non)
    c) un doute sur l'application sans que le programme soit redémarré (même ainsi je suis toujours avec la même voix la piste registre ne serait pas la bonne ?)
    d) utiliser le "bac à sable" du registre serait-il possible ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 685
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 097
    Points
    13 097
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    a) j'ai un doute sur la création du TRegistry avec "seulement" le KEY_WOW64_64KEY en ajoutant KEY_WRITE OR KEY_WOW64_64KEY, plus d'erreur
    OpenKey ne force aucun flag. Si tu les redéfinis au Create (par défaut KEY_ALLACCESS), il faut ajouter tous ceux dont tu as besoin et donc KEY_WRITE.

    Cela dit HKCU/Software est une clé partagée et non redirigée. KEY_WOW64_64KEY est inutile (voire problématique, cf. ci-dessous).

    Citation Envoyé par SergioMaster Voir le message
    b) un doute sur la mise à jour sans avoir besoin d'exécuter le programme en mode administrateur (besoin d'un manifeste?) (a priori non)
    HKCU ne nécessite pas de droit administrateur.

    Citation Envoyé par SergioMaster Voir le message
    c) un doute sur l'application sans que le programme soit redémarré (même ainsi je suis toujours avec la même voix la piste registre ne serait pas la bonne ?)
    Soit ça nécessite une déconnexion de la session, soit c'est KEY_WOW64_64KEY qui crée une redirection (un nœud WOW6432Node) qui n'a pas lieu d'être sous HKCU.

    Citation Envoyé par SergioMaster Voir le message
    d) utiliser le "bac à sable" du registre serait-il possible ?
    Qu'est-ce que c'est ?

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,
    le bac à sable ou Sandbox est une fonctionnalité qui a été ajoutée à W10 Pro version 1903. Il permet d'exécuter un logiciel ou un script dans un espace protégé sans altérer les fichiers système de Windows ou le registre.

    il faut l'installer comme une fonctionnalité optionnelle dans W10.

    A+
    Charly

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/09/2014, 16h05
  2. Réponses: 5
    Dernier message: 23/03/2011, 14h28
  3. Modifier une clé de registre
    Par avinain dans le forum Visual Studio
    Réponses: 7
    Dernier message: 25/02/2011, 11h45
  4. Modifier une clé du registre
    Par mouva dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 20/07/2009, 19h18
  5. peut-on modifier une fenêtre windows ?
    Par Titiou357 dans le forum Windows XP
    Réponses: 10
    Dernier message: 21/01/2008, 14h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo