Se connecter avec
S'enregistrer | Connectez-vous

[resolu]Mettre le programme au démarrage de Windows (avec le registre)

Dernière réponse : dans Programmation

Bonjour, a tous et à toutes.
J'ai un probleme, pour mettre mon programme au démarrage pour XP ET Vista.
Sous XP, aucun probleme. Je crée un programme tout simple qui éxecute le vrai (avec start) dans Programmes > Démarrage.
Mais pour Vista j'ai beau le mettre dans "C:\Users\Admin\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Démarrage", mais là il me vré un autre dossié Démarrage !!!! (Il y a deux dossier au meme emplacement qui ont le même nom !) mais au démarrage il ne le prend pas en compte.

Donc j'ai pensé au Registre mais je ne sais pas comment m'en servir avec regedit alors je vous dis pas ce que ça donne en C.
Donc si il y en a qui savent comment ajouter au registre un programme au démarrage de windows, n'hésitez pas !

EDIT: Maintenant je sais comment faire avec regedit (http://www.commentcamarche.net/faq/sujet-10341-lancer-un-programme-au-demarrage-via-la-base-de-registre) mais en C ...
Merci !
Lassé par la pub ? Créez un compte

Exemple pour l'autorun d'xp :

  1. HKEY hKey;
  2. DWORD Etat;
  3. Etat = 1;
  4.  
  5. if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Cdrom", 0, KEY_WRITE, &hKey) == ERROR_SUCCESS)
  6. {
  7. if(RegSetValueEx(hKey, "AutoRun", 0, REG_DWORD, (LPBYTE)&Etat, sizeof(Etat)) == ERROR_SUCCESS)
  8. RegCloseKey(hKey);
  9.  
  10. }

En fait j'ouvre d'abord la clef en écrituer avec KEY_WRITE
et pour l'écrire j'utilise la fonction RegSetValueEx();

après le reste sont des tests pour vérifier que ça marche et tout.
La bibliothèque est tout simplement windows.h il me semble.

RESOLU !
Avec MS-DOS, (pour ceux qui veulent savoir) il faut mettre:
  1. system("REG ADD HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run /v BlocNote /t REG_SZ /d c:\\WINDOWS\\System32\\notepad.exe");
  2. /* Ca va mettre le bloc note au démarrage:
  3. /v Nom
  4. /t Type
  5. /d Donné /*

(code non testé)
voila !

ptitcois a dit :
Oui, mais moi je parle en C avec la fonction system()

je ne parlais pas de ne pas doubler le \, j'avais pas vu ton message après ton édition, tu avais mis des / au lieu de \
ptitcois a dit :

@jerbe: désolé mais je trouve plus simple de passer par MS-DOS

(il faut arreter de parler de ms-dos la ou il n'y en a pas :o )
Expert Programmation

Citation :
(il faut arreter de parler de ms-dos la ou il n'y en a pas :o )
On pourrait débattre là-dessus (int 21h ;)  ), mais c'est pas le sujet :) 

Je trouve étonnant de programmer en C et de faire appel à l'interpréteur de commandes pour simplement mettre à jour une clé dans la base de registre...

bah, de toute facon, le sujet est clos si j'ai bien suivi :) 
ce n'est pas sur l'utilisation ou non des commandes et interruptions héritées de msdos que je parle, c'est le fait que msdos est un système d'exploitation qui n'existe plus, dans le sens ou win xp ne fait qu'émuler (notamment l'int 21h) de ms dos pour ce qui lui est propre et les commandes portant le même noms sont des réécritures.

ca me gène pas plus que ca, mais je pense que c'est une incompréhension (par exemple le fait que ptitcois parle de "commandes msdos") qui mérite d'etre corrigée.

je trouve que c'est comparable à dire que j'utilise msdos si je lance un "cd" sous un shell linux ;) 
Expert Programmation

Concernant l'interruption 21h, ça a toujours été une interruption logicielle, et ça le restera. Donc, la couche la plus basse du DOS est toujours la même. :p 
Ce qui change c'est la couche juste au dessus (le noyau NT) qui est effectivement est la majeure partie de l'OS.
L'interpréteur de commande de windows n'est aussi qu'une évolution de l'interpréteur de commandes de MS-DOS.

Effectivement comme tu le dis, le MS-DOS était un OS, et on confondait facilement l'interpréteur de commandes avec l'OS, comme aujourd'hui on confond l'OS windows avec l'environnement graphique.

CRicky a dit :
Concernant l'interruption 21h, ça a toujours été une interruption logicielle, et ça le restera. Donc, la couche la plus basse du DOS est toujours la même. :p 

je te l'accorde volontiers, je m'y connais pas tellement pour ce qui touche l'assembleur et cie, tout au plus des essais de redémarrage de pc et un pauvre programme à l'époque où il fallait attendre le rafraîchissement de l'écran pour changer d'image, et encore, il était pompé d'un bouquin :) 

toujours est il qu'on est d'accord sur le fond:
CRicky a dit :

Effectivement comme tu le dis, le MS-DOS était un OS, et on confondait facilement l'interpréteur de commandes avec l'OS, comme aujourd'hui on confond l'OS windows avec l'environnement graphique.


mais bon tout ca, c'est la faute à bill, il aurait mis un autre fond, une autre invite et appelé son système d'un autre nom que le logiciel... :whistle: 

bon désolé je me recorrige:
@jerbe: désolé mais je trouve plus simple de passer par [des commandes de Microsoft (R) (TM) (C All rights reserved 1980 - 2008) Windows (R) .....]

content ?
désolé pour les dates dus copyright de MS je connais pas :p  .
@Cricky: oui, je sais, mais j'étais pressé et je trouvait la commande Microsoft (r) ..... plus simple.
Mais je vais voir de plus près la fonction prévu pour le C.

ptitcois a dit :
bon désolé je me recorrige:
@jerbe: désolé mais je trouve plus simple de passer par [des commandes de Microsoft (R) (TM) (C All rights reserved 1980 - 2008) Windows (R) .....]

content ?
désolé pour les dates dus copyright de MS je connais pas :p 

en fait, ca me fait ni chaud ni froid, ce n'était rien d'autre qu'une remarque (on en a encore le droit?), mais tu peux continuer à appeler une cuillère, fourchette, ca ne me dérange pas du tout ;) 

Eu, je crois que tu t'es mélangé les pinceaux.

Si tu veux faire du SZ, il faut juste mettre REG_SZ à la ligne 7

j'ai pas vérifier dans la doc, mais je suis presque sur que c'est REG_SZ
(ça fait un moment que j'ai pas utilisé ces truc là)
Expert Programmation

ptitcois a dit :
mais si je met une chaine de caractere dans un DWORD
DWORD Etat;
et si je mets:
Etat = "C:\\JeSaisPasQuoi";
je penses qu'il ne va pas accepter
Si je me trompe, tu peux faire un Exemple avec un SZ
EDIT, eh oui:
http://ptitcois35.free.fr/screenshoots/dword.png

tu essaies d'assigner une chaine de caractères (donc un pointeur char *) sur une valeur DWORD.
Un pointeur étant une adresse mémoire codée sur 4 octets, comme le DWORD, la conversion est théoriquement possible, mais Etat ne contient pas la chaine, mais l'adresse où est écrite la chaine. La norme ansi C suggère (en annexe) aux compilateurs de mettre un warning, car il est plus probable que ce soit une erreur de programmation (ce qui est le cas ici).

Bon, comme tu m'as l'aire relativement paumé je te remet un autre exemple plus simple avec une valeur string

  1. HKEY hKey;
  2. char valeur[99] = "abcdef";
  3.  
  4. if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Cdrom", 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)
  5. {
  6. if(RegSetValueEx(hKey, "AutoRun", 0, REG_SZ, valeur, lstrlen(valeur)) == ERROR_SUCCESS)
  7. RegCloseKey(hKey);
  8. }


(j'ai ouvert la clef en ALL_ACCESS : donc lecture, écriture)
Plus d'info ici : http://msdn.microsoft.com/en-us/library/ms724923(VS.85).aspx
Lassé par la pub ? Créez un compte
Tom's guide dans le monde