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()etShowWindow(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.
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.
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 :
#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. wallFilecontient 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 0→0.jpgChangeDesktopColor.exe 999→4.jpg(défaut)ChangeDesktopColor.exe 1 2→0.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.
_TESTsimplifie le dev avec fichiers locaux0.jpg-4.jpg.- Vérification
wcsstrdistingue fichier de couleur unie. SPIF_UPDATEINIFILEenregistre dans le registre.- Argument ligne de commande sélectionne le fond (0-4).
— Editorial Team
Aucun commentaire pour le moment.