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
Cette partie là fonctionne
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;
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_64KEYen 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 ?
Partager