begin process at 2013 06 19 07:55:26
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Application

 > FOND D'ÉCRAN CHANGEANT DE COULEUR EN FONCTION DE L'HEURE (WINDOWS)

FOND D'ÉCRAN CHANGEANT DE COULEUR EN FONCTION DE L'HEURE (WINDOWS)


 Description

Cliquez pour voir la capture en taille normale
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/c pp/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-win dow-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

  • // 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);
  • }
// 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)
...


 Sources de la même categorie

GESTION DE MEMOIRE AUTOMATIQUE EN C++ par magicsystem
Source avec Zip CHAT EN MODE CONSOLE AVEC API WINDOWS par Pylouq
Source avec une capture TRACE ROUTE AVEC QT par LoVerMaKi
Source avec Zip TABLEAU INTERACTIF ET CONVIVIAL par accessone
Source avec Zip Source avec une capture PROGRAMME DE SAISIE D'UN RUBIK'S CUBE par AffreuxJojp

 Sources en rapport avec celle ci

MASTER MIND CONSOLE par bast63
Source avec Zip Source avec une capture LIBGRAPHC - DESSIN D'UI EN MODE CONSOLE par Nenyan
Source avec Zip Source avec une capture ONGLETS MULTICOLORES (WIN32 API) par racpp
Source avec Zip Source avec une capture VISUALISEUR RVB AVEC QT par Sunglasses
Source avec Zip Source .NET (Dotnet) PUISSANCE 4 MODE CONSOLE par Remoh

Commentaires et avis

Commentaire de BruNews le 04/03/2011 16:42:57 administrateur CS

Pour la Xeme fois:
On ne fait pas un prog console pour masquer dès le début la console. On fait un prog GUI commençant en WinMain() et ainsi pas de console à masquer puisqu'on n'en crée pas.

#include <iostream>
#include <time.h>
#include <cstdlib>
Ces headers n'ont rien à faire dans un prog en winAPI.

Commentaire de Yohan98 le 07/03/2011 17:15:04

Bonjour,
Mon compilateur bug lorsque j'essaie de compiler ce programme. Je ne sais pas de quoi ça vient.
Est-il possible que quelqu'un me compile ce programme (sans code malicieux) ?

Merci d'avance

Commentaire de tynry le 07/03/2011 20:17:34

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.

Commentaire de Yohan98 le 08/03/2011 09:33:52

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

Commentaire de za1407 le 08/03/2011 14:19:22

je n'arrive pas a compiler sous CodeBlocks
es ce quelqu' un aurait il une idée
merci
Salut

Commentaire de minuit13 le 27/03/2011 05:26:00

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.

Commentaire de Yohan98 le 28/03/2011 19:02:19

Je sais pas après, je connait pas trop le logiciel.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

texte opengl qui change de couleur [ par mondrone ] J'ai un programme OpenGL (+ Glut sous DevCpp) qui suivant certaines touches doit afficher des phrases pr&#233;d&#233;finies &#224; l'&#233;cran avec g Changer la couleur de la scrollbar d'une Edit Box ? [ par benland ] Bon, ca va faire 2 jours que je me bat et je n'arrive toujours pas à colorer la scrollbar d'une Editbox, alors je m'en remet à ce Forum pour savoir s De la couleur c mieux [ par tibob51 ] <TD id=HB_Focus_Element vAlign=top width="100%" background="" height=250 UNSELECTAB effacement automatique [ par dann3 ] Je cherche à lancer au démarrage de Windows un fichier texte dans notepad(par exemple) jusque là je sais faire... mais comment faire disparaitre autom Dégardé de couleur [ par julienbj ] Je cherche &#224; modifier l'apparence de mes progressbar. J'ai d&#233;ja mes fonctions pour &#233;crire du texte &#224; l'int&#233;rieu... par sous c Changer la couleur de fond d'une appli [ par Toutoun13 ] Bonjour, J'ai cr&#233;&#233; une appli de base avec VC++. Par defaut le fond de la fenetre est blanc. Est il possible de modifier ce fond, j'aimerais Transparence avec glBlend [ par smoove5198 ] Bonjour, A l'aide d'un tutorial j'ai cr&#233;e une classe qui affiche du texte sous opengl a partir d'une texture bmp listant tous les caracteres. D Retourner à la ligne précédente et changer le couleur dans un cin . [ par Muner ] Salut &#224; tous .Je programme en C++ et j'aimerais savoir comment revenir une ligne auparevent, le code :cout &lt;&lt; "\b" ;ne permet pas de passer Recuperer la Couleur d'un Pixel dans une fenetre. [ par nomlingote ] Bonjour à tous, Est il possible de connaitre la couleur d'un pixel dans une fenetre (dont on connait le handle ) ou sur l'ensemble de l'ecran. J'ai es Couleur + OpenGL [ par norton ] Bonjour, j'ai d&#233;ssin&#233; une sc&#232;ne 3d avec les textures . Jusque la aucun probl&#232;me.Mais maintenant que j'affiche des particules dans


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Juin 2013
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,451 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales