begin process at 2012 05 27 20:23:02
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Système

 > LIBÉRER LA TAILLE MAXIMALE D'UNE FENÊTRE PAR SUBCLASSING

LIBÉRER LA TAILLE MAXIMALE D'UNE FENÊTRE PAR SUBCLASSING


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Système Classé sous :subclassing, taille, fenêtre, injection, résolution Niveau :Initié Date de création :26/10/2010 Date de mise à jour :30/10/2010 12:16:43 Vu / téléchargé :2 533 / 211

Auteur : rt15

Ecrire un message privé
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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-ECRA N-PLUS-GRAND-RESOLUTION-MAX-SON-MONITEUR_1473380.a spx#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é.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

26 octobre 2010 08:49:29 :
Ortho
26 octobre 2010 15:19:35 :
Ortho aussi
30 octobre 2010 12:16:44 :
Compatibilité Vista (Ajout du privilège de debug au process)

 Sources du même auteur

Source avec Zip Source avec une capture HOOK D'API, INJECTION DE DLL, TABLE D'IMPORT
Source avec Zip Source avec une capture [WIN32]ECHANGE INTER-PROCESSUS VIA SHAREDMEMORY, MUTEX ET EV...
Source avec Zip Source avec une capture FENÊTRE UN PEU CUSTOMISÉE
Source avec Zip Source avec une capture LE MINIMUM POUR UNE FENÊTRE WIN32
Source avec Zip Source avec une capture RÉDACTEUR D'UNITÉ DE CHARGEMENT DYNAMIQUE DE DLL

 Sources de la même categorie

Source avec Zip Source avec une capture EXEMPLES DE THREADS par Jean_Jean
Source avec Zip LECTURE DE LA MEMOIRE D'UN AUTRE PROCESSUS par Mokost
Source avec Zip Source avec une capture OBSERVATEUR DE PROCESSUS ACTIFS; VPROCESS 1,0 par Neftali
UN SELECTDIRECTORY QUI SE PLACE AU BON ENDROIT par ThWilliam
Source avec une capture VOTRE PROGRAMME DE MAIL COMME CLIENT MAIL PAR DÉFAUT SOUS WI... par MAURICIO

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture SIZECONVERTER : UNE MINI LIBRAIRIE DE CONVERSION DE TAILLE par LaDentDeLait
Source avec Zip Source avec une capture CONVERSION PIXEL, MM, INCH, TWIPS, POINT... par yanb
Source avec Zip Source avec une capture GESTION DE CASES À COCHER PERSONNALISÉES DANS UN STRINGGRID par Jean_Jean
Source avec Zip Source avec une capture METHODE DE SUBSTITUTION : RÉSOLUTION DE DEUX ÉQUATIONS À DEU... par bad_dark_spirit
Source avec Zip Source avec une capture SIMULATEUR DE DÉFAUT DE PAGE (( GESTION DE LA MÉMOIRE )) " O... par offlake

Commentaires et avis

Commentaire de cirec le 29/10/2010 11:35:57 administrateur CS

Salut,

bon alors ... :D

comme d'habitude du beau code et très instructif ... Bravo

mais ... il y a un mais ^^
chez moi, (XP SP3 2 écrans) sans code supplémentaire j'arrive à agrandir, à la main, les fenêtres jusqu'à atteindre la taille des deux écrans (1024 * 2 = 2048) ... mais (<--- il est là :D) quand je lance ton programme j'obtiens rien de plus ... pas un pixel, ni en hauteur ni en largeur !!!

est ce du aux deux écrans ?
à la version de l'OS ?
où autre ... une idée ?

@++

Commentaire de rt15 le 29/10/2010 12:10:28 administrateur CS

Salut,

Bah non, vu de loin je n'ai pas d'idée... Et je n'ai accès ni à un SP3 (Je préfère rester en SP2), ni à deux écrans. Mais j'essaierais sur Vista demain.

Si tu as un peu de temps pour diagnostiquer, tu peux :
1/ Vérifier que la dll est injectée correctement dans l'autre processus. Facile avec processexplorer qui affiche dans le panneau du bas la liste des dlls (Switcher entre dll et handle avec ctrl+D et ctrl+ H). Tu peux aussi ajouter une MessageBox dans la dll.
2/ Tester si le problème est plutôt du côté du message en faisant une appli Delphi comme sur le lien plus haut:
http://www.delphicorner.f9.co.uk/articles/wapi8.htm
Mais au lieu de limiter la taille minimale, agrandir la taille maximale.

Commentaire de Caribensila le 29/10/2010 19:01:20

Salut,

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

Commentaire de Caribensila le 29/10/2010 19:08:47

@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 ?

Commentaire de cirec le 30/10/2010 00:14:57 administrateur CS 10/10

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 ?

Commentaire de Caribensila le 30/10/2010 01:08:56 10/10

@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.

Commentaire de rt15 le 30/10/2010 12:33:53 administrateur CS

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. :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

problème de taille de fenêtre sur certaines machines [ par bigoud ] j'ai développé un soft qui ne pose pas de problèmes d'affichage de fenêtre dans 99% des cas sur différentes machines. Ce n'est pas un problème de tail Adapter une la taille d'une form [ par darky93 ] Bonjour,J&#146;ai cr&#233;&#233; mon programme sans me soucier de la r&#233;solution de mon &#233;cran, maintenant je me retrouve avec une form trop g Taille d'une TForm plus grande que la largeur de l'écran [ par speedman31 ] Bonjour,J'ai une question toute simple : pour faire un test de capture Bitmap, j'aurai besoin de dimensionner une fenêtre plus grande que la taille de Taille des composants (notamment images) en fonction de la taille de la fenêtre [ par jcniloc ] Est-il possible de faire en sorte qu'à l'ouverture de la fenêtre tout ce qui la compose soit redimensionné en fonction de la taille de l'écran et que objets pas à leur place dans une fenêtre? [ par Gerard ] Bonjour, excusez-moi si ma question est un peu longue... J'ai écrit une application qui a déjà été téléchargée par environ 300 personnes, et un tiers taille sur le disque d'un fichier ou d'un dossier [ par rols26 ] Existe-il un moyen en delphi de récupérer la taille occupée sur le disque par un fichier ou un dossier? J'arrive à récupérer la taille réelle en octet Taille d'un cluster [ par rols26 ] Bonjour, Est-il possible de déterminer la taille d'un cluster à partir d'un disque ou d'un répertoire? Si oui comment faire? Par avance merci, Rols2 La fenêtre CPU s'ouvre en cas d'erreur [ par gpletinckx ] Bonjour, La fenêtre CPU s'ouvre en cas d'erreur; comme je ne comprends à cette fenêtre, elle ne m'est d'aucune utilité. De plus elle masque mes autres impression sur imprimante matricielle [ par newflash ] Je dispose d'une application développée sous delphi 5 dans mon application j'ai plusieurs tailles personnalisé de mes etats de sorties sur un problème de résolution [ par 0redou ] Bonjour à tous Je viens juste de développer ma première application. Quand j'éxecute l'application sur mon pc, elle s'affiche à plein écran mais quan


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,562 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales