Fond d'écran changeant de couleur en fonction de l'heure (windows)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 119 fois - Téléchargée 17 fois

Contenu du snippet

Ce petit programme change le fond d'écran Windows une fois par minute.
Il lui applique une couleur qui varie progressivement en fonction de l'heure de la journée, de façon à ce que la couleur soit toujours la même à une heure donnée (exemple : turquoise à midi).

La variation ne s'observe donc pas de minutes en minutes, mais se perçoit d'un quart d'heure à l'autre par exemple. On peut donc avoir une idée grossière de l'heure qu'il est si on se souvient des couleurs...

Il est conseillé d'avoir une version de Windows qui possède les barres transparentes pour pouvoir voir le fond d'écran du bureau à travers elles.

Le programme regroupe quelques notions utiles tel que la lecture de l'heure, le changement du fond d'écran, la création d'un BMP (et sa sauvegarde) et enfin le masquage de la fenêtre d’exécution.

Il est vrai que le code n'est pas très "propre" (tout dans la même page...), mais il est fortement commenté et bien indenté.

Afin de réaliser ce programme, j'ai pas mal navigué sur internet pour trouver des réponses à mes problèmes, je me dois donc de citer mes sources surtout quand j'ai bien copié (BMP) :
Merci à Eagl1 pour sa fonction pour créer un fichier BMP :
http://www.developpez.net/forums/d671362/c-cpp/cpp/creation-bmp-cpp/
Merci au rédacteur de Hackers Life pour son astuce pour cacher la fenêtre facilement :
http://hackerslife.blogspot.com/2005/01/hide-window-in-c.html

Les fonctions de choix de couleurs sont un peu étranges, mais elles permettent de ne jamais avoir de nuances de gris, donc toujours des couleurs vives et visibles.

Cette version est celle que j'utilise sur mon PC (Windows 7) donc elle devrait être fonctionnelle
Astuce : Pour alléger le poids du BMP, il est créé d'une taille de 64x64px seulement, il faut donc dire à Windows d'étirer le fond d'écran avant de lancer le programme.
J'ai aussi mis un raccourci de mon .exe dans les "Démarrage" ce qui le lance automatiquement au démarrage.

Source / Exemple :


// Permet de tromper le compilateur et transforme le programme console en appli WIN32
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <iostream>
#include <time.h>
#include <cstdlib>
#include <math.h>

using namespace std;

void Create_Save_BMP(float hm,char path[]);

int main()
{
    // Ces deux premieres lignes permettent au programme de s'executer dans une fenetre console invisible
    // (sauf dans les processus biensur)
    HWND hWnd = GetConsoleWindow();
    ShowWindow( hWnd, SW_HIDE );
    // On cree les variables temporelles
    SYSTEMTIME st;
    int oldTime=0;
    // Chemin de destination du fond d'ecran (peut être par exemple C:\\TEMP)
    char path[]="D:\\Docs\\Wallpaper\\wallpaper.bmp";

    // Une petite boucle (pas tres propre je l'avoue) pour que le programme continue tout seul
    do {
        // on recupere l'heure actuelle
        GetLocalTime(&st);
        // Si on a une minute d'ecart avec la boucle d'avant, on peut alors modifier le papier peint
        if (abs(st.wMinute-oldTime)>0){
            // On creer un nouveau ficher bmp pour le papier peint
            // (pour rester compatible avec Windows qui gere mal les autres formats...)
            // on passe en argument l'heure actuelle exprimee en minutes et arrondie a 2 chiffres
            Create_Save_BMP(round(100*((float)(st.wHour*60+st.wMinute)/60))/100,path);
            // on modifie le papier peint en allant le chercher la ou on l'a enregistre avec la fonction precedente
            SystemParametersInfo( SPI_SETDESKWALLPAPER, 0, (PVOID)path, SPIF_UPDATEINIFILE );
            // on met a jour la sauvegarde du temps
            oldTime=st.wMinute;
        }
    }while(true);
    return 0;
}

// Fonction de creation et sauvegarde des BMPs
void Create_Save_BMP(float hm,char path[]){
    // Initialisation des variables
    int r=0,g=0,b=0;
    // Si vous ne voulez pas etirer le fond d'ecran avec windows, vous pouvez mettre ici la resolution de votre ecran
    // Une taille importante (1280x800) ralentit le programme pour rien car un BMP c'est vite lourd...
    int iWidth = 64;
    int iHeight = 64;
    HANDLE file;
    BITMAPFILEHEADER fileHeader;
    BITMAPINFOHEADER fileInfo;
    RGBTRIPLE image;
    DWORD write = 0;

    // Creation du BMP a proprement parler
    file = CreateFile(path,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    fileHeader.bfType = 19778;
    fileHeader.bfSize = sizeof(fileHeader.bfOffBits) + sizeof(RGBTRIPLE);
    fileHeader.bfReserved1 = 0;
    fileHeader.bfReserved2 = 0;
    fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

    fileInfo.biSize = sizeof(BITMAPINFOHEADER);
    fileInfo.biWidth = iWidth;
    fileInfo.biHeight = iHeight;
    fileInfo.biPlanes = 1;
    fileInfo.biBitCount = 24;
    fileInfo.biCompression = BI_RGB;
    fileInfo.biSizeImage = 0;
    fileInfo.biXPelsPerMeter = 0;
    fileInfo.biYPelsPerMeter = 0;
    fileInfo.biClrImportant = 0;
    fileInfo.biClrUsed = 0;

    WriteFile(file,&fileHeader,sizeof(fileHeader),&write,NULL);
    WriteFile(file,&fileInfo,sizeof(fileInfo),&write,NULL);

    // C'est ici que sont definies les couleurs en fonction des heures
    // il est possible de les definir aleatoirement (rand()) ou de changer les fonctions a votre guise
    if (hm<4||hm>20)r=255;
    else{
        if(hm>=4 && hm<8)r=255-255*(hm-4)/4;
        else{
            if(hm>16 && hm<=20)r=255*(hm-16)/4;
            else r=0;
        }
    }
    if (hm<12&&hm>4)g=255;
    else{
        if(hm>=12 && hm<16)g=255-255*(hm-12)/4;
        else{
            if(hm>0 && hm<=4)g=255*(hm-0)/4;
            else g=0;
        }
    }
    if (hm<20 && hm>12)b=255;
    else{
        if(hm>=20 && hm<24)b=255-255*(hm-20)/4;
        else{
            if(hm>8 && hm<=12)b=255*(hm-8)/4;
            else b=0;
        }
    }
    // on ecrit la couleur dans le fichier et on l'enregistre
    for (int i = 0; i < (iWidth*iHeight); i++)
    {
        image.rgbtRed = r;
        image.rgbtGreen = g;
        image.rgbtBlue = b;

        WriteFile(file, &image, sizeof(RGBTRIPLE), &write, NULL);
    }
    CloseHandle(file);
}

Conclusion :


Possibilités d'amélioration :
- mettre l'application en System Tray
- avoir une interface graphique pour choisir les couleurs
- faire en sorte que Windows étire automatiquement le fond d'écran
- faire une sorte de petit flash lumineux aux heures fixes (voire toutes les demi-heures)
...

A voir également

Ajouter un commentaire

Commentaires

cs_Yohan98
Messages postés
13
Date d'inscription
dimanche 25 octobre 2009
Statut
Membre
Dernière intervention
28 mars 2011

Je sais pas après, je connait pas trop le logiciel.
minuit13
Messages postés
1
Date d'inscription
vendredi 2 octobre 2009
Statut
Membre
Dernière intervention
27 mars 2011

et tu sur que tu le compile en c car il semble que seul les mot cles du c++ pose un probleme dans ton compilateur.
za1407
Messages postés
2
Date d'inscription
samedi 27 septembre 2008
Statut
Membre
Dernière intervention
14 août 2013

je n'arrive pas a compiler sous CodeBlocks
es ce quelqu' un aurait il une idée
merci
Salut
cs_Yohan98
Messages postés
13
Date d'inscription
dimanche 25 octobre 2009
Statut
Membre
Dernière intervention
28 mars 2011

Toujours pareil, voici le log de compilation :

Compilateur: Default compiler
Exécution de gcc.exe...
gcc.exe "D:\Documents and Settings\Yohan\Bureau\c\screen.c" -o "D:\Documents and Settings\Yohan\Bureau\c\screen.exe" -I"D:\Dev-Cpp\include" -L"D:\Dev-Cpp\lib"
D:\Documents and Settings\Yohan\Bureau\c\screen.c:3:20: iostream: No such file or directory
D:\Documents and Settings\Yohan\Bureau\c\screen.c:5:19: cstdlib: No such file or directory
D:\Documents and Settings\Yohan\Bureau\c\screen.c:8: error: syntax error before "namespace"
D:\Documents and Settings\Yohan\Bureau\c\screen.c:8: warning: data definition has no type or storage class
D:\Documents and Settings\Yohan\Bureau\c\screen.c: In function `main':
D:\Documents and Settings\Yohan\Bureau\c\screen.c:37: error: `true' undeclared (first use in this function)
D:\Documents and Settings\Yohan\Bureau\c\screen.c:37: error: (Each undeclared identifier is reported only once
D:\Documents and Settings\Yohan\Bureau\c\screen.c:37: error: for each function it appears in.)
D:\Documents and Settings\Yohan\Bureau\c\screen.c: In function `Create_Save_BMP':
D:\Documents and Settings\Yohan\Bureau\c\screen.c:105: error: 'for' loop initial declaration used outside C99 mode
Exécution terminée
Tynry
Messages postés
2
Date d'inscription
mercredi 14 novembre 2007
Statut
Membre
Dernière intervention
7 mars 2011

BruNews : Je suis désolé pour le masquage de la console, c'est une astuce que j'ai trouvé sur internet, et ne sachant pas bien faire d'interfaces graphiques, c'est une simplification que j'avais adopté... Il est vrai que ce n'est vraiment pas très propre de le faire de cette façon. Je modifierai le code quand je saurai faire des GUI.

Yohan98 : Enlève le lignes suivantes du code :
#define _WIN32_WINNT 0x0500

HWND hWnd = GetConsoleWindow();
ShowWindow( hWnd, SW_HIDE );

Si le problème est réglé, c'est qu'il faudrait créer une GUI normale. En effet, ces 3 lignes ne servent qu'à masquer la console pour que le programme s'effectue en tâche de fond... pas très règlo je l'admet.
Si le problème persiste, c'est peut-être que tu n'es pas sous windows.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.