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

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

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.