Libérer la taille maximale d'une fenêtre par subclassing

Soyez le premier à donner votre avis sur cette source.

Vue 5 375 fois - Téléchargée 538 fois

Description

Suite à une question sur le fofo (En gros, comment avoir une fenêtre firefox dont la taille maximum n'est pas limitée à la résolution de l'écran) :
http://www.delphifr.com/forum/sujet-SIMULER-ECRAN-PLUS-GRAND-RESOLUTION-MAX-SON-MONITEUR_1473380.aspx#6

Windows ne limite en fait pas à proprement parler la taille des fenêtres à la résolution de l'écran. Il ne fait que proposer ce comportement par défaut aux applications qui ont tout à fait le droit de le surcharger en traitant le message WM_GETMINMAXINFO.
http://msdn.microsoft.com/en-us/library/ms632626(VS.85).aspx

Les développeurs Delphi connaissent bien ce message très utile pour limiter le redimensionnement de la fenêtre :
"http://www.delphicorner.f9.co.uk/articles/wapi8.htm"

Dans le cas de la question, c'est un peu plus compliqué car c'est le comportement d'une autre application que l'on souhaite modifier.

Pour modifier le comportement d'une fenêtre d'un processus différent du sien, la méthode la plus classique est le subclassing.

Un hook avec SetWindowHookEx est moins approprié.
Déjà car WH_GETMESSAGE n'intercepte que les messages postés, pas les messages sendés (Ce qui est le cas de WM_GETMINMAXINFO).
En effet, les messages sendés (SendMessage) appellent directement la procédure de la fenêtre, tandis que les messages postés (PostMessage) sont récupérer par Peek/GetMessage (-> WH_GETMESSAGE).
Quant aux hook WH_CALLWNDPROC/WH_CALLWNDPROCRET, d'après la documentation, il ne permettent pas de modifier les messages.
Ce serait curieux que le système fasse une copie de MINMAXINFO pour appeler le hook, mais je n'ai pas vérifier. Autant faire ça proprement via un subclassing.

On peut trouver de la doc sur le subclassing ici :
http://msdn.microsoft.com/en-us/library/ms633570(VS.85).aspx#subclassing_window

Mais dans cet exemple il est appliqué dans le cas où l'application modifie une de ses propres fenêtres.
Le problème est que l'on passe à SetWindowLong l'adresse d'une fonction qui doit se trouver dans l'autre processus.
Donc pour pouvoir utiliser le subclassing dans un autre processus, il faut lui injecter une dll.

Mon source propose donc un .exe et une dll, sous forme d'un groupe de projet UpdateWindowMaxSize.bpg :
1/ UpdateWindowMaxSize.dpr : Le .exe injecteur qui permet de sélectionner une fenêtre et injecter la dll.
2/ WindowSubClassing : La dll qui va réaliser le subclassing.

Remarques :
La dll fait un subclassing sur toutes les fenêtres principales actuellement ouverte du processus (Pas uniquement la fenêtre sélectionnée).
Elle ne libère pas la taille des fenêtres de taille fixe (Devrait être faisable avec SetWindowLong de GWL_EXSTYLE/GWL_STYLE pour modifier le style).
Essayer d'injecter deux fois le même processus n'a aucun effet : la dll n'est chargé qu'une fois par Windows.
Le .exe est dispo en .exec dans le zip, a renommé si quelqu'un veut essayer sans avoir Delphi.

Une fois la taille libéré, on peut agrandir la fenêtre jusqu'à 30000 pixels (Théorie) en jouant un peu avec.
Un SetWindowPos peut être ajouté au code de la dll pour agrandir la fenêtre automatiquement.

Conclusion :


Le subclassing ne se limite bien sûr pas à la taille des fenêtre et est une méthode très utile quand il faut modifier une application tierce, ce qui est toujours compliqué.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Ah bien vu le coup de l'unicode. A vu de nez, il y a au moins le CreateRemoteThread sur LoadLibraryA avec un nom de dll en unicode qui n'avait aucune chance de marcher. Mais pour porter complètement, j'aurais bien besoin d'une [cynisme]Delphi 2010 edition perso/cynisme.

En tout cas ça marchait pas sur Vista non plus ! Problème de privilège, mais j'ai mis à jour le source avec la correction.

En tout cas, merci pour les commentaires et les essais. :)
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
@Cirec
En fait, je n'ai pas encore compilé le source de rt15. J'ai juste testé l'.exe et jeté un coup d'oeil aux fichiers.pas.
Pour moi, je crois qu'il faut que je me libère bien 2/3 jours pour digérer un truc pareil (et encore! sans Madame Caribensila qui est particulièrement bavarde en cette saison).
Les sources de rt15 n'étant jamais des rogatons ou des resucées, les commentaires aident en général beaucoup mon assimilation. Et ton dernier y participera à coup sûr ! ;)

C'est sûr que c'est une belle démo, et qui va bien plus loin que la préoccupation du forum.
Merci à tous deux.
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
ayé j'ai trouvé :p

D 2009 et l'unicode.
- l'injection ne se faisait pas ... pourtant il n'y avait pas d'erreur et les handles étaient bien trouvés/alloués ???

j'ai donc modifié le code pour passer le tout en AnsiString et là, magie, tout fonctionne ... Bravo encore belle démo ;)

@Caribensila:
justement je voulais te demander sous quelle version de Delphi as-tu compilé le code ?
as-tu essayé sur ta dernière version ?
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
@Cirec
Il ne serait pas étonnant qu'avec 2 écrans, le bridage par défaut de la taille des fenêtres effectué par Windows ait un mécanisme différent, non ?
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
Salut,

Pour info, ça fonctionne chez moi avec :
- XP
- SP3
- 1 seul écran (1440x900)
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.