Changer l'ecran de veille en C/C++

Le
sanohuty
bonjour gens du monde,

actuellement sur un mini projet pour mes debuts en programmation win32
(et en beaucoup d'autre),
je rencontre souvent des difficultés mais rien d'insurmontable.Or
depuis un long moment de la journée,
je suis bloqué devant un bien épineux problème, je vais tenter de
m'expliquer sans trop m'étendre..

Je télécharges via la fonction URLDownloadToFileA un fichier scr que
je mets dans le dossier system32
je change dans la base de registre la valeur de la clé SCRNSAVE.EXE
contenue dans
HKEY_CURRENT_USERControl PanelDesktop par le chemin du fichier
telechargé..

Le probleme intervient là, lorsque je vais dans les propriétés de
l'affichage, il n'est pas compté comme étant l'écran de veille actif,
pire encore, il n'est pas dans la liste..
j'ai tenté un :

Code :

1. SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, scr_b, 0, 0);


sans resultat..

J'ai pourtant bien cherché sur Internet, rien n'y fait, personne n'a
deja rencontré ce genre de probleme..
y aurait il quelque âme assez charitable pour me sortir de mon
petrin ? Merci a ceux ci et a ceux qui m'auront lus.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Christian ASTOR
Le #19046361
On 3 avr, 15:03, wrote:

Je télécharges via la fonction URLDownloadToFileA un fichier scr que
je mets dans le dossier system32
je change dans la base de registre la valeur de la clé SCRNSAVE.EXE
contenue dans
HKEY_CURRENT_USERControl PanelDesktop par le chemin du fichier
telechargé..

Le probleme intervient là, lorsque je vais dans les propriétés de
l'affichage, il n'est pas compté comme étant l'écran de veille acti f,
pire encore, il n'est pas dans la liste..



Il faut faire un SPI_SETSCREENSAVEACTIVE avec TRUE et
SPIF_SENDWININICHANGE
puis, WritePrivateProfileString() dans le boot du system.ini (mappé)
avec le nom court (GetShortPathName()) et broadcaster un
WM_WININICHANGE
(mais c'est bizarre qu'il ne soit pas dans la liste si c'est un
vrai .scr...)
sanostock
Le #19132291
On 3 avr, 17:28, Christian ASTOR
On 3 avr, 15:03, wrote:

> Je télécharges via la fonction URLDownloadToFileA un fichier scr qu e
> je mets dans le dossier system32
> je change dans la base de registre la valeur de la clé SCRNSAVE.EXE
> contenue dans
> HKEY_CURRENT_USERControl PanelDesktop par le chemin du fichier
> telechargé..

> Le probleme intervient là, lorsque je vais dans les propriétés de
> l'affichage, il n'est pas compté comme étant l'écran de veille ac tif,
> pire encore, il n'est pas dans la liste..

Il faut faire un SPI_SETSCREENSAVEACTIVE avec TRUE et
SPIF_SENDWININICHANGE
puis, WritePrivateProfileString() dans le boot du system.ini (mappé)
 avec le nom court (GetShortPathName()) et broadcaster un
WM_WININICHANGE
(mais c'est bizarre qu'il ne soit pas dans la liste si c'est un
vrai .scr...)



Bonjour, merci pour tes indications qui m'aident a y voir un peu plus
clair.
Malheureusement j'ai pas pu trouver quel genre de variable on devait
modifier/ajouter dans le system.ini
et ce malgres plusieurs recherches.. Et pourrais tu me détailler un
peu plus explicitement le " broadcaster un
WM_WININICHANGE". SystemParametersInfo() ?

Que veux tu dire par "mais c'est bizarre qu'il ne soit pas dans la
liste si c'est un vrai .scr."
Qu'a partir du moment où on a posé un SCR dans le dossier windows/
system32/ il devrait apparaitre au moins
dans la liste ?

Merci beaucoup pour ton attention.
Christian ASTOR
Le #19132891
wrote:

Bonjour, merci pour tes indications qui m'aident a y voir un peu plus
clair. Malheureusement j'ai pas pu trouver quel genre de variable on devait
modifier/ajouter dans le system.ini et ce malgres plusieurs recherches..



Les paramètres de WritePrivateProfileString() sont : "boot",
"SCRNSAVE.EXE", le path du .scr converti en nom court avec
GetShortPathName() et donc "system.ini"

Et pourrais tu me détailler un peu plus explicitement le " broadcaster un
WM_WININICHANGE". SystemParametersInfo() ?



Il faut appeler :
SendNotifyMessage(HWND_BROADCAST, WM_WININICHANGE, 0,
(LPARAM)TEXT("Windows"));
et
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, 0, SPIF_SENDWININICHANGE);

Que veux tu dire par "mais c'est bizarre qu'il ne soit pas dans la
liste si c'est un vrai .scr."
Qu'a partir du moment où on a posé un SCR dans le dossier windows/
system32/ il devrait apparaitre au moins dans la liste ?



Oui, car le Panneau de Config recherche et analyse (le header notamment)
tous les .scr de system32
Par exemple, si on fait une copie de "ssbezier.scr" en "Copie de
ssbezier.scr", "Copie de ssbezier" doit apparaitre dans la liste.
Par contre si on crée un faux foo.scr (genre un fichier texte), "foo"
n'apparaitra pas.
sanostock
Le #19175661
bonjour,

toujours dans la serie "j'ai du mal", j'ai tenté d'appliquer tes
explications pourtant clair, mais il semblerais que je bloque sur une
bete histoire de type..
Voici un bout de mon code, ce sera plus simple :

void set_scr(string path, const char *scr)
{
HKEY cle; // Clé registre a ouvrir
bool scr_b; // booleen du systemparaminfo
int sz_buff, err, val;
char *cur_scr;
const char *new_scr;
string path_scr;
string path_tst;

scr_b = true;
sz_buff = 512;
cur_scr = (char*)malloc(sz_buff * sizeof(char));

err = RegOpenKeyEx(HKEY_CURRENT_USER, "Control Panel\Desktop",
(DWORD)NULL, KEY_ALL_ACCESS, &cle);
err = RegQueryValueEx(cle, "SCRNSAVE.EXE", NULL, NULL, (BYTE*)
cur_scr, (DWORD*)&sz_buff);

/*
** initialiser cur_scr avec le chemin du fichier.
** Passer tout ca en dynamique (BDR etc...)
*/
val = 1;
path_scr = path + "\";
path_scr = "c:\windows\system32\";
path_scr += scr;
path_tst = path_scr;
RegSetValueEx(cle, "SCRNSAVE.EXE", 0, REG_SZ, (BYTE*)path_scr.c_str
(), strlen(path_scr.c_str()));
path_scr = "1";

RegSetValueEx(cle, "ScreenSaveActive", 0, REG_SZ, (BYTE*)
path_scr.c_str(), strlen(path_scr.c_str()));
val = 60;
path_scr = "60";
RegSetValueEx(cle, "ScreenSaveTimeOut", 0, REG_SZ, (BYTE*)
path_scr.c_str(), strlen(path_scr.c_str()));


//----- ici se situe mon probleme

long length = 0; // ne marche pas en int non plus
DWORD tlen = 12;
TCHAR* buffer = NULL;

length = GetShortPathName(path_tst.c_str(), NULL, 0);
tlen = GetShortPathName(path_tst.c_str(), NULL, 0);

cout << " recup TLEN = " << tlen << endl;
cout << " recup LEN = " << length << endl;

// Je voulais essayer plusieurs type

buffer = new TCHAR[length];

length = GetShortPathName(path_tst.c_str(), buffer, length);

delete [] buffer;

scr_b = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, 0,
SPIF_SENDWININICHANGE);
cout << " scr b = " << scr_b << endl;
scr_b = SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, 60, 0,
SPIF_SENDWININICHANGE);
SendNotifyMessage(HWND_BROADCAST, WM_WININICHANGE, 0,(LPARAM)TEXT
("Windows"));
}

Merci de ne pas juger de la qualité du code (retours d'erreurs etc..),
tout ce que je demande c'est comment me sortir de ce probleme, en gros
lorsque j'appelle une premiere fois la fonction GetShortPathName, il
me renvoie 0, pourtant la string passé en argument est bien un path.
Serait-ce dû a un probleme de type ?
DErniere question, comment se presente une chaine remplie dans le
buffer par GetShortPathName ? Ne puis je coder moi meme une telle
fonction a ma sauce ?

Merci pour cette aide plus que precieuse.

(aucune des recherches que j'ai effectué pour le moment ne s'est avér é
fructueuse).



On 17 avr, 13:31, Christian ASTOR
wrote:
> Bonjour, merci pour tes indications qui m'aident a y voir un peu plus
> clair. Malheureusement j'ai pas pu trouver quel genre de variable on de vait
> modifier/ajouter dans le system.ini et ce malgres plusieurs recherches. .

Les paramètres de WritePrivateProfileString() sont : "boot",
"SCRNSAVE.EXE", le path du .scr converti en nom court avec
GetShortPathName() et donc "system.ini"

> Et pourrais tu me détailler un peu plus explicitement le " broadcaste r un
> WM_WININICHANGE".   SystemParametersInfo() ?

Il faut appeler :
SendNotifyMessage(HWND_BROADCAST, WM_WININICHANGE, 0,
(LPARAM)TEXT("Windows"));
et
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, 0, SPIF_SENDWININICHANGE );

> Que veux tu dire par "mais c'est bizarre qu'il ne soit pas dans la
> liste si c'est un vrai .scr."
> Qu'a partir du moment où on a posé un SCR dans le dossier windows/
> system32/ il devrait apparaitre au moins dans la liste ?

Oui, car le Panneau de Config recherche et analyse (le header notamment)
tous les .scr de system32
Par exemple, si on fait une copie de "ssbezier.scr" en "Copie de
ssbezier.scr", "Copie de ssbezier" doit apparaitre dans la liste.
Par contre si on crée un faux foo.scr (genre un fichier texte), "foo"
n'apparaitra pas.


Christian ASTOR
Le #19181451
wrote:

Merci de ne pas juger de la qualité du code (retours d'erreurs etc..),
tout ce que je demande c'est comment me sortir de ce probleme, en gros
lorsque j'appelle une premiere fois la fonction GetShortPathName, il
me renvoie 0, pourtant la string passé en argument est bien un path.
Serait-ce dû a un probleme de type ?
DErniere question, comment se presente une chaine remplie dans le
buffer par GetShortPathName ? Ne puis je coder moi meme une telle
fonction a ma sauce ?



Si ça ramène 0, il faut appeler GetLastError() pour avoir la cause de
l'erreur (souvent = 2, ERROR_FILE_NOT_FOUND)

Exemple (Unicode) avec GetShortPathName() =>

WCHAR sPath[_MAX_PATH], sSaverName[_MAX_PATH];
GetSystemDirectory(sPath, sizeof(sPath)/sizeof(WCHAR));
lstrcat(sPath, TEXT("\Copie de ssbezier.scr"));
// Avant : sPath = "C:WINDOWSsystem32Copie de ssbezier.scr"
DWORD dwSize = GetShortPathName(sPath, sSaverName, ARRAYSIZE(sSaverName));
// Après : sSaverName = "C:WINDOWSsystem32COPIED~1.SCR"
Publicité
Poster une réponse
Anonyme