Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

5 réponses
Avatar
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=E9s mais rien d'insurmontable.Or
depuis un long moment de la journ=E9e,
je suis bloqu=E9 devant un bien =E9pineux probl=E8me, je vais tenter de
m'expliquer sans trop m'=E9tendre..

Je t=E9l=E9charges 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=E9 SCRNSAVE.EXE
contenue dans
HKEY_CURRENT_USER\Control Panel\Desktop par le chemin du fichier
telecharg=E9..

Le probleme intervient l=E0, lorsque je vais dans les propri=E9t=E9s de
l'affichage, il n'est pas compt=E9 comme =E9tant l'=E9cran de veille actif,
pire encore, il n'est pas dans la liste..
j'ai tent=E9 un :

Code :

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


sans resultat..

J'ai pourtant bien cherch=E9 sur Internet, rien n'y fait, personne n'a
deja rencontr=E9 ce genre de probleme..
y aurait il quelque =E2me assez charitable pour me sortir de mon
petrin ? Merci a ceux ci et a ceux qui m'auront lus.

5 réponses

Avatar
Christian ASTOR
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...)
Avatar
sanostock
On 3 avr, 17:28, Christian ASTOR wrote:
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.
Avatar
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 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.
Avatar
sanostock
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 PanelDesktop",
(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:windowssystem32";
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:
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.


Avatar
Christian ASTOR
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"