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 :

Code : S�lectionner tout - Visualiser dans une fen�tre � part
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 :

Code : S�lectionner tout - Visualiser dans une fen�tre � part
PostMessage(hwnd, WM_CLOSE, 0, 0);
La r�ception du message de fermeture 'WM_CLOSE' entraine l'ex�cution du code suivant :

Code : S�lectionner tout - Visualiser dans une fen�tre � part
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' :

Code : S�lectionner tout - Visualiser dans une fen�tre � part
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 😙