Retour à l'accueil

C++ changement de fond d'écran Windows : WinAPI et COM

Programme C++ qui change cycliquement le fond d'écran du bureau Windows et la couleur unie. Décrit le masquage de la console avec linker, configurations TEST/Release, vérification du fond d'écran actuel via SystemParametersInfo et configuration via WinAPI/COM.

Changement programmatique du fond d'écran et de la couleur en C++ sous Windows
Advertisement 728x90

Changer le fond d'écran et les couleurs du bureau en C++ sur Windows

Ce programme C++ pour Windows bascule le fond d'écran du bureau entre des images et une couleur unie. Il s'exécute sans fenêtre de console visible. En mode débogage, la fenêtre s'affiche pour le dépannage ; en versions release et test, elle reste masquée.

Deux méthodes pour masquer la console :

  • Masquage programmatique avec GetConsoleWindow() et ShowWindow(hWnd, SW_HIDE). La fenêtre clignote brièvement avant de se cacher.
  • Directives du linker (approche recommandée) :
#ifndef _DEBUG
#pragma comment(linker, "/subsystem:windows")
#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
#endif

La première directive le compile en application GUI avec point d'entrée WinMain(). La seconde conserve main() mais évite la création de console. Pas de clignotement.

Google AdInline article slot

Configurations de build

Trois configurations Visual Studio : Debug, Release, TEST (hérite de Release).

TEST ajoute la définition de préprocesseur _TEST dans les propriétés du projet (C/C++ → Préprocesseur).

  • TEST : Images dans le dossier de l'exe sous 0.jpg...4.jpg. Lancement : ChangeDesktopColor.exe X (X=0-4).
  • Release : Utilise des chemins complets, indépendamment de l'emplacement de l'exe.

Pour déboguer TEST en Debug, décommentez #define _TEST.

Google AdInline article slot

Récupérer le chemin de l'exe (clé pour TEST) :

wchar_t pathTmp[MAX_PATH] = { L'\0' };
GetModuleFileName(NULL, pathTmp, MAX_PATH);
std::filesystem::path dir = ((std::filesystem::path)pathTmp).parent_path();

argv[0] est vide au lancement depuis l'Explorateur, d'où GetModuleFileName.

Sélection du fichier par argument :

Google AdInline article slot
#ifdef _TEST
    switch (*argv[1]) {
    case '0': filePath = dir.wstring() + L"\\0.jpg"; fileName = L"0.jpg"; break;
    // ... idem pour 1-4
    default: filePath = dir.wstring() + L"\\4.jpg"; fileName = L"4.jpg";
    }
#else
    switch (*argv[1]) {
    case '0': filePath = L"C:\\folder\\subfolder\\filename0.jpg"; fileName = L"filename0.jpg"; break;
    // ...
    }
#endif

Vérifier le fond d'écran actuel

Récupérer le fond actuel :

wchar_t wallFile[MAX_PATH] = { L'\0' };
SystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, wallFile, 0);
wchar_t* ptr = wcsstr(wallFile, fileName.c_str());
  • Si ptr == NULL : couleur unie ou fichier différent.
  • wallFile contient le nom du fichier ou est vide pour une couleur unie.

Définir le fond d'écran ou la couleur

Logique de basculement :

if (!ptr && std::filesystem::exists(filePath)) {
    BOOL result = SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, (void*)filePath.c_str(), 
                                        SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
} else {
    COLORREF blackColor = RGB(0, 0, 0);
#ifdef MyCOM
    HRESULT hr = ChangeDesktopBackgroundColor(blackColor);
    if (SUCCEEDED(hr)) {
        SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, NULL, SPIF_SENDWININICHANGE);
    }
#else
    if (SetDesktopSolidColor(blackColor)) {
        SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, NULL, SPIF_SENDWININICHANGE);
    }
#endif
}

Choisir l'API via #define MyCOM :

  • WinAPI (SetDesktopSolidColor) : méthode principale.
  • COM (ChangeDesktopBackgroundColor) : alternative.

SPIF_SENDWININICHANGE diffuse la mise à jour à toutes les fenêtres.

Exemples de lancement TEST :

  • ChangeDesktopColor.exe 00.jpg
  • ChangeDesktopColor.exe 9994.jpg (défaut)
  • ChangeDesktopColor.exe 1 20.jpg (premier argument)

Utilisations pratiques

Idéal pour alterner les fonds : image → noir → image → ...

Utilisez des fonds comme fiches de raccourcis : 0.jpg affiche les combinaisons clés pour Razer NAGA X (12+12 boutons avec modificateur). Accès rapide aux macros sans perdre le focus.

Points clés :

  • Masquage par linker supérieur au programmatique — pas de flash.
  • _TEST simplifie le dev avec fichiers locaux 0.jpg-4.jpg.
  • Vérification wcsstr distingue fichier de couleur unie.
  • SPIF_UPDATEINIFILE enregistre dans le registre.
  • Argument ligne de commande sélectionne le fond (0-4).

— Editorial Team

Advertisement 728x90

Lire ensuite