Bonjour à tous,
Nostalgique du temps où il était possible d'avoir du contenu HTML en fond d'écran du bureau Windows, je cherche à reproduire ce comportement en créant une application affichant une fenêtre entre le fond d'écran et les icônes du bureau.
Je programme en C++ (bon sang, bien 15 ans que j'y ai pas touché 🤪 ) sous Windows 11 avec Visual Studio Code.
Pour créer cette fenêtre, j'utilise cette technique de ninja : https://www.codeproject.com/Articles...n-Windows-plus.
Le handle retourné (wallpaper_hwnd) sert de parent à la fenêtre de mon application, créée grâce à la ligne suivante :
HWND hwnd = CreateWindowEx( 0, CLASS_NAME, L"Ma fenêtre", WS_CHILD | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, wallpaper_hwnd, NULL, hInstance, NULL );
J'ai aussi ajouté une icône dans la zone de notification avec un menu me permettant de quitter l'appli.
Lorsque je clique sur 'Quitter', j'appelle la fermeture de ma fenêtre grâce au message suivant :
PostMessage(hwnd, WM_CLOSE, 0, 0);
La réception du message de fermeture 'WM_CLOSE' entraine l'exécution du code suivant :
1 2 3 4 5 6 7 8 9 10 11
| case WM_CLOSE:
{
WriteToLog(L"Fenêtre en train de se fermer.");
BOOL windowDestroyed = DestroyWindow(hwnd);
if (windowDestroyed) {
WriteToLog(L"\tFenêtre enfant correctement détruite");
} else {
WriteToLog(L"\tFenêtre enfant non détruite");
}
break;
} |
Puis l'on passe dans le code lors de la réception du message de destruction de la fenêtre 'WM_DESTROY' :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| case WM_DESTROY:
{
WriteToLog(L"Je suis dans Destroy de la fenêtre fille");
// Supprimer l'icône de la zone de notification
Shell_NotifyIcon(NIM_DELETE, &g_nid);
// Détruire et libérer la fenêtre parente wallpaper_hwnd si elle existe
HWND wallpaper_hwnd = GetParent(hwnd);
if (wallpaper_hwnd != NULL)
{
WriteToLog(L"J'ai trouvé une fenêtre parente, je cherche à la détruire");
BOOL wallPaperDestroyed = DestroyWindow(wallpaper_hwnd);
if (wallPaperDestroyed) {
WriteToLog(L"\tFenêtre parente correctement détruite");
} else {
WriteToLog(L"\tFenêtre parente non détruite");
}
}
// Changer la couleur de fond de la fenêtre
HBRUSH hbrBackground = CreateSolidBrush(RGB(255, 0, 0)); // Rouge
SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG_PTR)hbrBackground);
// Forcer le rafraichissement de la fenêtre enfant
InvalidateRect(hwnd, NULL, TRUE);
// Forcer le rafraichissement de la fenêtre parent
InvalidateRect(wallpaper_hwnd, NULL, TRUE);
PostQuitMessage(0);
break;
} |
Et c'est là que le bas blesse.
Le retour dans le terminal m'indique que mon application c'est quittée normalement, mais je vois toujours un carré blanc dégueulasse entre mon fond d'écran et les icônes du bureau.
Les retours dans le fichier de log m'indiquent :
- Que 'Fenêtre parente non détruite'. Je m'y attendais, c'est 'ProgMan' qui la créé je ne dois pas pouvoir la détruire comme ça.
- Que 'Fenêtre enfant correctement détruite'.
La tentative de changement de couleur du fond de la fenêtre enfant dans 'WM_DESTROY' échoue, alors qu'il fonctionne avant la réception du message de fermeture de la fenêtre 'WM_CLOSE'.
Est-ce là une preuve supplémentaire que ma fenêtre fille est bien détruite ?
Est-ce un problème de rafraichissement de la fenêtre parent ?
Une piste pour me permettre de me retrouver avec un espace tout propre et tout vide entre mon arrière plan de bureau et mes icônes ?
Merci d'avance 😙
Partager