J'ai été utilisé pour penser que wm_create est le premier message qu'une fenêtre reçoit. Toutefois, lorsque vous testez cette hypothèse sur une fenêtre de niveau supérieur, elle s'avère être fausse. Dans mon test, WM_MINMAXInfo est arrivé en tant que premier message. P>
Donc, quel est le premier message qu'une fenêtre est garantie? P>
4 Réponses :
Le message En réalité, il existe une incohérence intéressante dans la documentation MSDN - les messages de création semblent dépendre de savoir si vous appelez Je soupçonne fortement que la commande de message décrite dans Raymond Chen a également un peu intéressant Informations sur la création / destruction de la fenêtre a>. p>
Cela va à montrer, même des choses apparemment simples peuvent devenir complexes plus vous les regardez. P> wm_nccreate code> est en fait le Très premier message Votre fenêtre recevra , qui arrivera avant
wm_create code>. Il est lié à la création de la zone non client (par exemple, barre de titre, menu système, etc.), d'où le préfixe
nc code>. P>
wm_getminmaxinfo code> est envoyé avant La taille de la fenêtre / la position est modifiée et peut arriver avant
wm_create code> (voir ci-dessous pour plus). P>
wm_create code> est envoyé avant
createwindow () code> retourne, vous pouvez donc garantir que l'initialisation par fenêtre a été effectuée par ce point. Votre fenêtre de fenêtre recevra
wm_create code> une fois la fenêtre créée, mais avant que la fenêtre ne devienne visible (
wm_showwindow code>). P>
Creewindow () Code>
ou Creewindowex () CODE>
, mais il ne précise pas que les messages sont nécessairement répertoriés dans l'ordre de l'expédition . p>
créewindow () code>:
wm_create code>,
wm_getminmaxinfo code> et
wm_nccreate code> li> li> li>
createwindowex () code>:
wm_nccreate code>,
wm_nccalcsize code> et
wm_create code> li> li> li>
ul>
créewindow () code> doit avoir
wm_nccreate code> premier, et le
wm_create code> dernier, qui est cohérent avec la documentation de notification et la référence
créatewindowex () code> référence (et également cohérente avec ce que vous décrivez). P>
Intéressant que WM_NCCREATE a été introduit dans Win95, ce qui explique pourquoi il n'a pas été documenté dans "Windows de programmation" de Petzold lorsque je l'ai lu d'abord en 1997.
Wm_nccreate existe depuis Windows 1.0. Il y a beaucoup que Petzold n'a jamais tenté de couvrir.
Beaucoup d'informations utiles ici et je suis désolé de bowvote. Cependant, wm_nccreate est le tout premier message uniquement pour les fenêtres de haut niveau.
Correction à mon commentaire précédent. Wm_nccreate est le tout premier message uniquement pour les fenêtres non supérieures. Désolé pour le retard dans la correction de cela. :)
@gavinb, c'est faux! Après plusieurs tests, j'ai découvert que le premier message est (pourquoi jamais) WM_GETMINMAXInfo. Donc, la bonne chaîne est la suivante: wm_getminmaxinfo -> wm_nccreate -> wm_create code>
@ SEBI2020 Comment avez-vous testé cela? Vous avez probablement testé créewindow () code>? J'ai lié aux documents officiels ci-dessus pour ces API et cité les messages dans la section "Remarques". Avez-vous une autre référence?
@gavinb non, je n'ai aucune référence pour cela. J'ai enregistré les messages, qui ont été affichés sur la boucle de message. Et le premier qui s'est produit était wm_getminmaxinfo. J'ai essayé cela plus d'une fois et chaque fois que le premier message que je reçois est WM_GETMINMAXInfo (0x36).
@seb Nu wm_nccreate code> non
wm_getminmaxinfo code> est déjà affiché. Ce sont des messages non-files. En tant que tels, ils ne sont jamais observés par votre boucle de message (même lorsqu'ils sont envoyés sur des threads).
@gav J'ai suivi la documentation jusqu'à la version publiée en décembre 2008. À l'exception des plates-formes prises en charge, la documentation n'a pas du tout changé. Il n'y a aucune mention dans la documentation, que wm_nccreate code> était en effet le premier message envoyé à une procédure de fenêtre, comme la présente réponse suggère. Quelles sources avez-vous pour cela?
@InInspectable concernant "Messages non-files", les documents disent tous de ces messages: "Une fenêtre reçoit ce message via sa fonction WindowProc." Quant aux sources de la réponse (il y a de nombreuses années!) Ils sont tous liés dans la réponse et spécifiés sont sous "Remarques". Par exemple: "La fonction CreewindowEx envoie wm_nccreate, wm_nccalcsize et wm_create Messages à la fenêtre en cours de création." J'avais supposé que les événements ont été énumérés dans l'ordre. Compte tenu des commentaires des autres sur des événements qu'ils ont enregistrés, la commande ne semble pas correspondre. Je suppose que les docs ne correspondent pas à la réalité!
Les docs correspondent à la réalité. Votre interprétation est, qu'est-ce qui est en faute. La documentation fournit un ensemble de messages non exhaustif b>, envoyé à la procédure de fenêtre avant que la fonction de création de fenêtre ne revienne. Cela ne fait aucune promesse sur la commande, ni la complétude. La seule garantie que vous obtenez est que wm_nccreate code> est envoyé avant
wm_create code>. Je ne suis pas sûr de ce que vous essayiez de communiquer dans le commentaire en commençant par "concernant" Message non placé "" i>.
Vous pouvez utiliser SPY ++, qui est livré avec Visual Studio pour voir quels messages sont générés lorsque l'application ou la fenêtre est démarrée. P>
Vous avez répondu à votre propre question. Je vois aussi wm_getminmaxinfo, sur Windows XP SP3, suivi de wm_nccreate, wm_nccalcsize, et enfin wm_create avant Createwindowex () a même renvoyé la poignée à la fenêtre en cours de création. Quel garabage ' p>
La réponse générale est que Microsoft est incompétent lorsqu'il s'agit de création ordonnée et de destruction d'objets. Ils se font mal avec Windows, avec COM et avec des pilotes de périphérique. Il y a toujours un peu de Catch-22 où un objet est à moitié créé ou à moitié détruit nécessitant une solution compliquée du rond-point pour produire un produit fiable. P>
WM_GETMINMAXInfo est le premier message pour une fenêtre de niveau supérieur. Pour d'autres fenêtres, il ressemble à WM_NCCreate.
Les résultats par expérimentation sont meilleurs que de faire confiance à la source, d'autant plus que la source est composée d'une légion de programmeurs, et aucune ne connaît tout le code. Qui dit: p>
Le message du poing que je reçois est 0x24 (wm_getminmaxinfo). p>
Puis-je supposer que ce sera toujours le premier message? Non, puisque le changement de code entre les versions de Windows et Microsoft n'a pas documenté un message garanti pour être le premier reçu. p>
Bottom Line: Ne présumez pas que WM_Create a été appelé avant un autre message. P>
Non, l'expérimentation n'est jamais une bonne idée. Ces choses sont sans papiers pour une raison. Il n'y a aucune garantie que wm_getminmaxinfo code> toujours i> sera le premier message envoyé, quelle que soit la version de Windows et la configuration de la machine de l'utilisateur. Toute application qui s'appuie sur la réception de messages dans un certain ordre comme celle-ci est fondamentalement cassée. La documentation vous indique de supposer que
wm_nccreate code> est le premier message reçu. Vous devriez faire toute votre initialisation là-bas: cela fonctionnera à chaque fois, peu importe le système de votre application. Ne pas renverser les fenêtres d'ingénieur.
Cette question n'a aucun sens. Comme vous l'avez noté, les premiers messages ne sont pas toujours les mêmes. Selon si la fenêtre est créée visible ou non, une série de messages entiers peut venir à la fenêtreProcrocrocrocroc. quels messages et leur commande ont changé entre versions de Windows. Tout ce que vous êtes garanti est que wm_create - et maintenant wm_ncreate - sera envoyé avant que Creewindow revienne (en supposant une création de fenêtre réussie).
Chris, pourquoi un commentaire au lieu d'une réponse? En outre, ça n'a aucun sens? Je parie que 90% des développeurs Win32 juriraient WM_Create sont les premiers msg reçus (et j'étais l'un d'entre eux jusqu'à 30 secondes). Après tout, c'est ce que nous lisons tous dans nos manuels.
Serge Wautier convenu, je pensais que cela aussi jusqu'à ce que je fasse un petit test. Ceci est l'ordre de tous mes messages WM jusqu'à WM_Create: WM_GETMINMAXINFO, WM_NCCREATE, WM_NCCALCSIZE, WM_CREATE.