IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[Windows 11] Dimensions d'une fenêtre et mise à l'échelle Windows


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    février 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2005
    Messages : 200
    Points : 107
    Points
    107
    Par défaut [Windows 11] Dimensions d'une fenêtre et mise à l'échelle Windows
    Bonjour à tous,

    J'avance doucement mais surement dans mon projet d'afficher du contenu Web en arrière plan du bureau (Dont j'ai déjà parlé ici) et j'ai une nouvelle interrogation.

    Je récupère donc le handle de la fenêtre située sous les icônes du bureau de Windows grâce au morceau de code suivant :

    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
     
    BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
    	HWND p = FindWindowEx(hwnd, NULL, L"SHELLDLL_DefView", NULL);
    	HWND* ret = (HWND*)lParam;
    	if (p)
    	{
    		*ret = FindWindowEx(NULL, hwnd, L"WorkerW", NULL);
    	}
    	return true;
    }
     
    HWND get_wallpaper_window()
    {
    	HWND progman = FindWindow(L"ProgMan", NULL);
    	SendMessageTimeout(progman, 0x052C, 0, 0, SMTO_NORMAL, 1000, nullptr);
    	HWND wallpaper_hwnd = nullptr;
    	EnumWindows(EnumWindowsProc, (LPARAM)&wallpaper_hwnd);
    	return wallpaper_hwnd;
    }
    L'idée est ensuite d'y ajouter une fenêtre fille plein écran et sans bordure y affichant du Web grâce à WebView2 (Ça peut changer, Ultralight me fait de l’œil 👀 ).
    Et là c'est le drame : je n'ai pas un affichage satisfaisant en récupérant les dimensions de la fenêtre wallpaper_hwnd.
    Il semblerait que d'une façon ou d'une autre, le paramètre d'affichage Windows "Mise à l'échelle" ai une influence sur les dimensions de la fenêtre.

    Si ce paramètre est à 100% tout va bien, les dimensions obtenues par GetClientRect(wallpaper_hwnd, &wallpaperClientRect); sont (à peu près) celles attendues, à savoir deux moniteurs 4k.
    Si ce paramètre est à 125% (ce qui est mon cas si je ne veux pas me bousiller la rétine), les dimensions obtenues ne sont plus que de 80%.

    Lorsque je donne ces dimensions à ma fenêtre fille lors de sa création, si la mise à l'échelle est de 125%, celle-ci n'occupe plus tout mon bureau mais bien 80% (à la louche).

    J'ai tenté autre chose : donner le style WS_MAXIMIZE et la position et taille à CW_USEDEFAULT à ma fenêtre fille.
    Le résultat est étrange : mon bureau devient intégralement blanc, comme si la fenêtre occupait effectivement tout l'espace mis rien n'y est dessiné. Je ne peux pas changer sa couleur dans WM_PAINT ni y afficher mon contenu Web. Lorsque je demande les dimensions de ma fenêtre fille, je n'ai que des 0.
    Si je donne le style WS_MAXIMIZE mais que je donne une dimension (mettons 500 sur 500), j'ai toujours mon bureau intégralement blanc mais mon contenu s'affiche bien dans un carré de 500 par 500.

    J'ai essayé de récupérer les dimensions à donner à ma fenêtre grâce à MonitorFromWindow() et GetDesktopWindow() mais là encore je n'ai que du 80% lorsque la mise à l'échelle est à 125%.


    Avez-vous une solution ou des pistes pour donner les dimensions de l'arrière plan de mon bureau à ma fenêtre fille ?

    Merci !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2005
    Messages
    4 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : février 2005
    Messages : 4 964
    Points : 11 922
    Points
    11 922
    Par défaut
    Vous êtes sûr que les API prennent de "pixels" en paramètre et pas des "unités d'IHM" ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    février 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2005
    Messages : 200
    Points : 107
    Points
    107
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Vous êtes sûr que les API prennent de "pixels" en paramètre et pas des "unités d'IHM" ?
    Bonjour bacelar,
    La documentation pour GetClientRect parle de pixel, à part ça je ne suis sûr de rien. Sauf que le résultat à l'écran n'est pas ce à quoi je m'attends.
    Je ne sais pas ce que sont les IHM, je n'ai rien vu passer la dessus.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2005
    Messages
    4 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : février 2005
    Messages : 4 964
    Points : 11 922
    Points
    11 922
    Par défaut
    "GetClientRect" dans votre situation, où vous ne devez rien à la décoration de fenêtre de Windows, ça me parait étrange.

    IHM, c'est pour Interface Homme Machine (interface graphique quoi)
    Quand on utilise les primitives bas niveau de l'OS, généralement, on ne parle pas en pixel mais en unité d'interface, pour que le Kernel puisse faire sa tambouille au niveau des zoom et autres "facteur d'échelle".

    Il y a aussi de sombre bail de DPI-indépendance :
    https://stackoverflow.com/questions/...-4-window-area

    Que le calcul du nombre de pixel de la "zone cliente" d'une fenêtre sous le bureau soit mal calculé, ça ne me choquerait pas. C'est vraiment pas fait pour.

    Utilisez Spy++ pour avoir plus d'information sur ce machine.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    février 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2005
    Messages : 200
    Points : 107
    Points
    107
    Par défaut
    Citation Envoyé par bacelar Voir le message
    "GetClientRect" dans votre situation, où vous ne devez rien à la décoration de fenêtre de Windows, ça me parait étrange.
    Pourquoi cela ? Je veux bien dessiner ma fenêtre enfant dans la zone cliente de la fenêtre parente non ?

    Citation Envoyé par bacelar Voir le message
    Utilisez Spy++ pour avoir plus d'information sur ce machine.
    J'ai donc utilisé Spy++ et j'y ai trouvé quelque chose d’intéressant : les dimensions du rectangle de la fenêtre parente dans Spy++ sont de 7680x2170.
    Or, récupérées et affichées par mon programme, elles sont de 6144x1736. Ce qui est bien les dimensions de ma fenêtre fille dans Spy++.

    J'en pers mon latin.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    27 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 27 346
    Points : 41 438
    Points
    41 438
    Par défaut
    Ton programme est-il marqué comme "DPI-Aware"? Il y a des chances que ça change la réponse de Windows.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    février 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2005
    Messages : 200
    Points : 107
    Points
    107
    Par défaut
    Bonjour Médinoc, merci pour cette réponse.

    Citation Envoyé par Médinoc Voir le message
    Ton programme est-il marqué comme "DPI-Aware"? Il y a des chances que ça change la réponse de Windows.
    Je n'en ai pas la moindre idée.
    Où est ce que l'on voit ça ? Dans Visual Studio ?
    Ah ! J'ai ouvert les propriétés de mon projet et dans Outil Manifeste -> Entrée et sortie il y a un champ "Prise en charge DPI" à "Aucun". Est-ce que c'est ça ?

    Edit : Twingo ! J'ai passé en "Reconnaissant les résolutions élevées" et la fenêtre occupe maintenant tout l'espace.
    Par contre je ne sais pas quelles sont les différences entre "Reconnaissant les résolutions élevées" et "Reconnaissant les résolutions élevées par moniteur".

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    27 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 27 346
    Points : 41 438
    Points
    41 438
    Par défaut
    En gros:
    • Pas DPI-Aware: Le programme ne "comprend" pas l'idée de redimensionner ses fenêtres selon la valeur de zoom, résultat Windows le fait à sa place, agrandissant ses fenêtres et mentant sur leur taille.
    • DPI-Aware: Le programme est au courant que ça existe et est censé respecter cela, donc Windows le laisse faire, sans changer la taille de ses fenêtres et sans lui mentir sur les tailles existantes.
      Le problème, c'est qu'après l'ajout de ce flag, Windows a introduit la possibilité de régler deux moniteurs avec des valeurs de zoom différentes!
      Résultat, si tu as deux moniteurs avec des valeurs de zoom différentes, Windows va quand même faire l'agrandissement/mensonge sur un des moniteurs.
    • DPI-Aware par moniteur: Le programme est non seulement au courant que ça existe, mais aussi au courant que désormais les différents moniteurs de ton ordi peuvent avoir des valeurs de zoom différentes. Donc Windows n'est jamais censé agrandir/mentir.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. dimension d'une fenêtre en target="_blank"
    Par audax dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 19/07/2008, 08h43
  2. dimension d'une fenêtre
    Par daff86 dans le forum Tkinter
    Réponses: 2
    Dernier message: 17/06/2008, 01h09
  3. Problème avec la dimension d'une fenêtre
    Par sfpx dans le forum Delphi
    Réponses: 2
    Dernier message: 01/05/2007, 18h39
  4. prendre les dimensions d'une fenêtre
    Par ben_iap dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 07/12/2005, 13h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo