SUPPRIMER OU AJOUTER DES PROGRAMMES QUI SE LANCENT AU DÉMARAGE DE WINDOWS PAR LA

nah666 Messages postés 75 Date d'inscription samedi 30 août 2003 Statut Membre Dernière intervention 7 janvier 2008 - 13 oct. 2004 à 08:34
tuneserapasmonnom Messages postés 41 Date d'inscription vendredi 23 juin 2006 Statut Membre Dernière intervention 1 décembre 2008 - 23 août 2006 à 12:06
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/26786-supprimer-ou-ajouter-des-programmes-qui-se-lancent-au-demarage-de-windows-par-la-base-de-registre

tuneserapasmonnom Messages postés 41 Date d'inscription vendredi 23 juin 2006 Statut Membre Dernière intervention 1 décembre 2008
23 août 2006 à 12:06
Moi, j'ai un problème, mon appli s'ouvre deux fois au démarrage au lieu d'une.!!!
Aidez-moi!!!
svp
stp
ifebo Messages postés 181 Date d'inscription jeudi 10 mars 2005 Statut Membre Dernière intervention 28 décembre 2006
1 déc. 2005 à 08:19
OK, merci retaks666 mais je n'ai pas trouvé de mode d'emploi détaillé en français. Bon daccord ça reste assez simple à utiliser, c'est vrai mais quand même qq. fois il y a des subtilités d'utilisation qui peuvent nous échapper si on connait pas bien la langue. Je vais chercher, mais si tu connais une adresse qui en parle communique là moi. Merci.
retaks666 Messages postés 286 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 16 juillet 2007
30 nov. 2005 à 17:56
oui ifebo, ça fonctionne.
ifebo Messages postés 181 Date d'inscription jeudi 10 mars 2005 Statut Membre Dernière intervention 28 décembre 2006
30 nov. 2005 à 17:03
Bonjour.
retaks666, est-ce que StartupCPL fonctionne sur XP pro SP2 ? Merci.
retaks666 Messages postés 286 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 16 juillet 2007
18 oct. 2004 à 20:19
Je ne vois pas trop de quoi tu parles, essaie de regarder dans c:\Documents and Settings\[USER]\Menu Démarrer\Programmes\Démarrage,
ou tout simplement dans le menu démarer/tous les programmes/démarrage, sinon tape executer puis msconfig. sinon je ne vois pas.
Sinon, un bon programme pour gérer les programmes au démarage est StartupCPL, il se mets dans le panneau de configuration et gère très bien tout ça ;)
Voila.
greffierjc Messages postés 13 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 21 novembre 2009
18 oct. 2004 à 16:02
bonjour,

dans le même ordre d'esprit, comment peut-on enlever les "résidus" de la table de démarrage, qui ne sont plus dans les clés :
HKLM ou HKCU
\software\microsoft\windows\currentversion
\run
\runonce
\runservices
\runservicesonce

et les mêmes avec - final.

Ces logiciels résiduels font désordre.

Greffier.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
14 oct. 2004 à 11:05
Il faut un RegCloseKey() par cle ouverte.
Si on veut LIRE une valeur, on ne cree pas la cle, on cherche juste a ouvrir par RegOpenKeyEx().
cs_Multiprise Messages postés 63 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 23 avril 2013
14 oct. 2004 à 02:17
'Pour Infos voici une autre approche de la manipulation des registres (Module réutilisable):
Option Explicit
Dim lng As Long
Dim Buff As Long
'Constantes Types de clefs ClefRacine de la base de registres
Private Const HKEY_CLASSES_ROOT = &H80000000
Private Const HKEY_CURRENT_USER = &H80000001
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const HKEY_USERS = &H80000003
Private Const HKEY_DYN_DATA = &H80000004
'
'Type de données des valeurs de la base de registres
Private Const REG_SZ = 1 ' chaîne Unicode terminée par nul
Private Const REG_EXPAND_SZ = 2 ' chaîne Unicode terminée par nul
Private Const REG_DWORD = 4 ' nombre 32-bit (mot sur 4 octets)
'
' Valeurs de type de création
Private Const REG_OPTION_NON_VOLATILE = 0 'clef préservée lorsque le système est redémarré
'
'- Type Security_Attributes de la base de registres...
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Boolean
End Type
' Options de sécurité de clef de la base de registres.
Private Const READ_CONTROL = &H20000
Private Const KEY_QUERY_VALUE = &H1
Private Const KEY_SET_VALUE = &H2
Private Const KEY_CREATE_SUB_KEY = &H4
Private Const KEY_ENUMERATE_SUB_KEYS = &H8
Private Const KEY_NOTIFY = &H10
Private Const KEY_CREATE_LINK = &H20
Private Const KEY_READ = KEY_QUERY_VALUE + KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY + READ_CONTROL
Private Const KEY_WRITE = KEY_SET_VALUE + KEY_CREATE_SUB_KEY + READ_CONTROL
Private Const KEY_EXECUTE = KEY_READ
Private Const KEY_ALL_ACCESS = KEY_QUERY_VALUE + KEY_SET_VALUE + _
KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + _
KEY_NOTIFY + KEY_CREATE_LINK + READ_CONTROL
'
' Valeurs renvoyées lors des opérations (écriture, lecture, suppression, création, actualisation)
Private Const ERROR_NONE = 0
Private Const ERROR_BADKEY = 2
Private Const ERROR_ACCESS_DENIED = 8
Private Const ERROR_SUCCESS = 0
'
'****************************************************
'**** API Windows de Gestion des REGISTRES ****
'****************************************************
'Créer ou ouvrir une clef
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" _
(ByVal hKey As Long, _
ByVal lpSubKey As String, _
phkResult As Long) As Long

'Supprimer une clef
Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" _
(ByVal hKey As Long, _
ByVal lpSubKey As String) As Long

'Supprimer une valeur et les données correspondantes dans une clef
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" _
(ByVal hKey As Long, _
ByVal lpSubKey As String) As Long

'Lire une valeur et les données correspondantes
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" _
(ByVal hKey As Long, _
ByVal lpValueName As String, _
ByVal lpReserved As Long, _
lpType As Long, _
lpData As Any, _
lpcbData As Long) As Long

'Fixer ou créer une valeur avec données ou modifier les données d'une Valeur string
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" _
(ByVal hKey As Long, _
ByVal lpValueName As String, _
ByVal Reserved As Long, _
ByVal dwType As Long, _
ByVal lpData As Any, _
ByVal cbData As Long) As Long
''Fixer ou créer une valeur avec données ou modifier les données d'une Valeur DWORD
Private Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA" _
(ByVal hKey As Long, _
ByVal lpValueName As String, _
ByVal Reserved As Long, _
ByVal dwType As Long, _
lpValue As Long, _
ByVal cbData As Long) As Long


'*****************************************************************
'**** FONCTIONS ET PROCEDURES DE MANIPULATION DES REGISTRES ****
'*****************************************************************
'
'
'Convertis le nom de la ClefRacine (String ou entier) en entier long
'La valeur de la ClefRacine Pouvant être saisie en Numérique ou Alphanumérique
'-----------------------------------------------------------------------------
Private Function ConvertClef(ClefRacine As Variant) As Long
On Error Resume Next
If ClefRacine 0 Or ClefRacine "HKEY_LOCAL_MACHINE" Then ConvertClef = HKEY_LOCAL_MACHINE
If ClefRacine 1 Or ClefRacine "HKEY_CURRENT_USER" Then ConvertClef = HKEY_CURRENT_USER
If ClefRacine 2 Or ClefRacine "HKEY_CLASSES_ROOT" Then ConvertClef = HKEY_CLASSES_ROOT
If ClefRacine 3 Or ClefRacine "HKEY_USERS" Then ConvertClef = HKEY_USERS
If ClefRacine 4 Or ClefRacine "HKEY_DYN_DATA" Then ConvertClef = HKEY_DYN_DATA
End Function
'

'----------------------------------------------------------------
'Créer une nouvelle Clef (Subkey)
'----------------------------------------------------------------
Public Function RegCreateClef(ClefRacine As Variant, Chemin As String) As Long
Dim RetVal As Long
On Error Resume Next
'Suppression éventuelle de l'Anti-Slash (\) qui précède le chemin
If Mid(Chemin, 1, 1) "" Then Chemin Mid(Chemin, 2)
'Ajout éventuel d'un Anti-Slash (\) pour terminer le chemin
If Mid(Chemin, Len(Chemin), 1) <> "" Then Chemin = Chemin & ""
RetVal = RegCreateKey(ConvertClef(ClefRacine), Chemin, lng)
If RetVal = 2 Then Debug.Print ClefRacine & "" & Chemin & " : " & "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print ClefRacine & "" & Chemin & " : " & "Accès Refusé (ERROR_ACCES_DENIED)"
RegCreateClef = lng
End Function
'

'-----------------------------------------------------------------
'Supprimer une Clef
'-----------------------------------------------------------------
Public Function RegDeleteClef(ClefRacine As Variant, Chemin As String)
Dim RetVal As Long
On Error Resume Next
'Suppression éventuelle de l'Anti-Slash (\) qui précède le chemin
If Mid(Chemin, 1, 1) "" Then Chemin Mid(Chemin, 2)
'Ajout éventuel d'un Anti-Slash (\) pour terminer le chemin
If Mid(Chemin, Len(Chemin), 1) <> "" Then Chemin = Chemin & ""
RetVal = RegDeleteKey(ConvertClef(ClefRacine), Chemin)
If RetVal = 2 Then Debug.Print ClefRacine & "" & Chemin & " : " & "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print ClefRacine & "" & Chemin & " : " & "Accès Refusé (ERROR_ACCES_DENIED)"
End Function
'

'--------------------------------------------------------------------
'Ajouter une Valeur (String)
'--------------------------------------------------------------------
Public Function RegWriteVal(ClefRacine As Variant, Chemin As String, Valeur As String, Donnee As String)
Dim RetVal As Long
On Error Resume Next
If Trim(Donnee) "" Then Donnee " "
'Suppression éventuelle de l'Anti-Slash (\) qui précède le chemin
If Mid(Chemin, 1, 1) "" Then Chemin Mid(Chemin, 2)
'Ajout éventuel d'un Anti-Slash (\) pour terminer le chemin
If Mid(Chemin, Len(Chemin), 1) <> "" Then Chemin = Chemin & ""
RetVal = RegCreateKey(ConvertClef(ClefRacine), Chemin, lng)
If RetVal = 2 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Accès Refusé (ERROR_ACCES_DENIED)"
RetVal = RegSetValueEx(lng, Valeur, 0&, 1, Donnee, Len(Donnee) + 1)
If RetVal = 2 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Accès Refusé (ERROR_ACCES_DENIED)"
RegWriteVal = Donnee
End Function
'
'--------------------------------------------------------------------
'Ajouter une Valeur (Reg DWord)
'--------------------------------------------------------------------
Public Function RegWriteValDW(ClefRacine As Variant, Chemin As String, Valeur As String, Donnee As Long)
Dim RetVal As Long
On Error Resume Next
If Trim(Donnee) "" Then Donnee " "
'Suppression éventuelle de l'Anti-Slash (\) qui précède le chemin
If Mid(Chemin, 1, 1) "" Then Chemin Mid(Chemin, 2)
'Ajout éventuel d'un Anti-Slash (\) pour terminer le chemin
If Mid(Chemin, Len(Chemin), 1) <> "" Then Chemin = Chemin & ""
RetVal = RegCreateKey(ConvertClef(ClefRacine), Chemin, lng)
If RetVal = 2 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Accès Refusé (ERROR_ACCES_DENIED)"
Err.Clear
RetVal = RegSetValueExLong(lng, Valeur, 0&, 4, Donnee, 4)
If Err.Number <> 0 Then Debug.Print Err.Description; Err.Source
If RetVal = 2 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Accès Refusé (ERROR_ACCES_DENIED)"
RegWriteValDW = Donnee
End Function
'

'----------------------------------------------------------------
'Lire une Valeur
'----------------------------------------------------------------
Public Function RegReadVal(ClefRacine As Variant, Chemin As String, Valeur As String) As String
Dim RetVal As Long
On Error Resume Next
'Suppression éventuelle de l'Anti-Slash (\) qui précède le chemin
If Mid(Chemin, 1, 1) "" Then Chemin Mid(Chemin, 2)
'Ajout éventuel d'un Anti-Slash (\) pour terminer le chemin
If Mid(Chemin, Len(Chemin), 1) <> "" Then Chemin = Chemin & ""
Buff = 0
Buff = RegCreateKey(ConvertClef(ClefRacine), Chemin, lng)
If Buff 0 Then RetVal RegQueryValueEx(lng, Valeur, 0&, 1, 0&, Buff)
If Buff < 2 Then 'Si chaine vide
RegReadVal = ""
If RetVal = 2 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Accès Refusé (ERROR_ACCES_DENIED)"
Exit Function
End If
RegReadVal = String(Buff + 1, " ")
RetVal = RegQueryValueEx(lng, Valeur, 0&, 1, ByVal RegReadVal, Buff)
If RetVal = 2 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Accès Refusé (ERROR_ACCES_DENIED)"
RegReadVal = Left(RegReadVal, Buff - 1)
End Function
'

'----------------------------------------------------------------
'Supprimer une Valeur
'----------------------------------------------------------------
Public Function RegDeleteVal(ClefRacine As Variant, Chemin As String, Valeur As String)
Dim RetVal As Long
On Error Resume Next
'Suppression éventuelle de l'Anti-Slash (\) qui précède le chemin
If Mid(Chemin, 1, 1) "" Then Chemin Mid(Chemin, 2)
'Ajout éventuel d'un Anti-Slash (\) pour terminer le chemin
If Mid(Chemin, Len(Chemin), 1) <> "" Then Chemin = Chemin & ""
Buff = 0
Buff = RegCreateKey(ConvertClef(ClefRacine), Chemin, lng)
If Buff 0 Then RetVal RegDeleteValue(lng, ByVal Valeur)
If RetVal = 2 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print ClefRacine & "" & Chemin & Valeur & " : " & "Accès Refusé (ERROR_ACCES_DENIED)"
End Function
'
'

'********************************************************************************
'EXEMPLES D'UTILISATION
'********************************************************************************
'--------------------------------------------------------------------------------
'Activer l'Autorun de l'application en Cours avec passage de paramètres optionnel
'--------------------------------------------------------------------------------
Public Sub RegAutoRunWrite(Optional Parametres As String)
Dim RetVal As Long
On Error Resume Next
'RegWriteVal ConvertClef(ClefRacine), Chemin, Valeur, Donnees_de_la_valeur
RetVal = RegWriteVal("HKEY_LOCAL_MACHINE", "Software\Microsoft\Windows\CurrentVersion\Run", App.EXEName, App.Path & "" & App.EXEName & ".exe" & " " & Parametres)
If RetVal = 2 Then Debug.Print "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print "Accès Refusé (ERROR_ACCES_DENIED)"
End Sub
'

'----------------------------------------------------------------
'Vérifier si l'Autorun est activé pour l'application en cours
'----------------------------------------------------------------
Public Function RegAutoRunIsActif() As Boolean
On Error Resume Next
If RegReadVal("HKEY_LOCAL_MACHINE", "Software\Microsoft\Windows\CurrentVersion\Run", App.EXEName) <> "" Then RegAutoRunIsActif = True Else RegAutoRunIsActif = False
End Function
'

'----------------------------------------------------------------
'Supprimer l'Autorun de l'application en cours
'----------------------------------------------------------------
Public Sub RegAutoRunDelete()
Dim RetVal As Long
On Error Resume Next
RetVal = RegDeleteVal("HKEY_LOCAL_MACHINE", "Software\Microsoft\Windows\CurrentVersion\Run", App.EXEName)
If RetVal = 2 Then Debug.Print "Clef Invalide (ERROR_BADKEY)"
If RetVal = 8 Then Debug.Print "Accès Refusé (ERROR_ACCES_DENIED)"
End Sub
cs_Multiprise Messages postés 63 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 23 avril 2013
14 oct. 2004 à 02:03
Autre précision, en admettant qu'une session utilisateur soit ouverte, si une seconde session est ouverte sous un autre nom d'utilisateur, l'application sera à nouveau exécutée. Selon le type et les fonctionnalités de l'appli il peut parfois se produire des effets innatendus. Dans ce cas il serait bon d'ajouter en form_load ou sub_main un test de la forme :
IF App.PrevInstance=True then End
cs_Multiprise Messages postés 63 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 23 avril 2013
14 oct. 2004 à 01:46
Une petite précision toutefois importante:
Mise à part sous Windows 9x ou ME, les programmes ne seront pas exécutés au démarrage de windows, mais à l'ouverture d'une session utilisateur. C'est particulièrement important sur un serveur qui peut très bien être actif sans qu'une session utilisateur ne soit ouverte (lors d'un reboot automatique par exemple). C'est alors une session système qui mêne la danse et les applis ne seront pas lancées même si elles sont inscrites dans la base de registres en HKEY_LOCAL_MACHINE. Afin qu'une appli s'exécute au démarrage, if faut que celle-ci soit exécutée en tant que service et là c'est beaucoups plus compliqué. Si certains sont intéressés il est possible de développer la technique ou une des techniques (il en existe sûrement plusieurs) avec exemple réutilisable à l'appui.
Quant à ta source, elle est un très bon exemple modifiable et réutilisable pour exécuter une appli à l'ouverture d'une session utilisateur.
nah666 Messages postés 75 Date d'inscription samedi 30 août 2003 Statut Membre Dernière intervention 7 janvier 2008 1
13 oct. 2004 à 11:17
Certes
retaks666 Messages postés 286 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 16 juillet 2007
13 oct. 2004 à 11:15
ben en fait au départ j'ai fait cette source très rapidement pour une utilisation immédiate, mais ce n'est qu'après que je me suis dit que ça pourrait servir a d'autres, mais si j'ai le temps j'améliorerait ça ce soir, peut être même que je ferai un truc pour rajouter des progs. Enfin vu que le code est très court, je pense que ça ne doit pas poser trop de problèmes de compréhension.
nah666 Messages postés 75 Date d'inscription samedi 30 août 2003 Statut Membre Dernière intervention 7 janvier 2008 1
13 oct. 2004 à 08:34
L'idee est vraiment bonne, car c'est le genre de trucs qui sert tout le temps.

Si je peux me permettre 2 critiques :

- Tu devrais repenser a ton Interface, la faire plus en largeur pour pouvoir lire la totalité de la valeur de la key ( moi elle est coupée ).

- Et pourquoi ne pas donner de vrais noms aux controles ? , button1_click() c'est pas vraiment explicite.
Rejoignez-nous