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