Quelle est la différence entre WM_QUIT, WM_CLOSE, et WM_DESTROY dans un programme windows?
Je me demandais quelle était la différence entre le WM_QUIT, WM_CLOSE, et WM_DESTROY messages dans un programme windows, en substance: quand ils sont envoyés, et ils n'ont tout automatique des effets en plus de ce qui est défini par le programme?
WM_CLOSE est envoyé à la fenêtre lorsque "X" est pressé ou "Fermer" est choisi à partir du menu de la fenêtre. Si vous attrapez ce message c'est que votre appel comment la traiter - l'ignorer ou de fermer la fenêtre. Par défaut, WM_CLOSE passé à DefWindowProc causes de la fenêtre pour être détruit. Lorsque la fenêtre est détruite WM_DESTROY message est envoyé. Dans cette étape, en opposition àWM_CLOSE, vous ne pouvez pas arrêter le processus, vous ne pouvez effectuer un nettoyage nécessaire. Mais rappelez-vous que quand vous attrapez WM_DESTROY juste avant toutes les fenêtres enfants sont déjà détruits. WM_NCDESTROY est d'envoyer juste après toutes les fenêtres enfants ont été détruites.
WM_QUIT message n'est pas lié à une fenêtre (l' hwnd obtenu à partir de GetMessage est NULLE et aucune procédure de fenêtre est appelée). Ce message indique que la boucle de message doit être arrêté et l'application devrait être fermé. Lorsque GetMessage lit WM_QUIT elle retourne 0 pour indiquer que. Jetez un oeil à typique de la boucle de message extrait - la boucle est maintenue pendant GetMessage renvoie zéro. WM_QUIT peuvent être envoyées par PostQuitMessage fonction. Cette fonction est généralement appelé lorsque la fenêtre principale reçoit WM_DESTROY (voir typique de la procédure de fenêtre extrait de).
serait bien d'ajouter ce qui se passe lorsque l'Utilisateur Déconnexion / WM_ENDSESSION arrive. Est-ce à déclencher automatiquement WM_CLOSE / QUITTER / DÉTRUIRE ?
Tout d'abord, la WM_CLOSE et WM_DESTROY messages sont associés avec windows alors que le WM_QUIT message est applicable à l'ensemble de l'application (bien thread) et le message n'est jamais reçus par le biais d'une procédure de fenêtre (WndProc de routine), mais seulement par la GetMessage ou PeekMessage fonctions.
Dans votre WndProc de routine de l' DefWindowProc fonction prend en charge le comportement par défaut de ces messages. Le WM_CLOSE messages de demandes que l'application doit fermer et le comportement par défaut est d'invoquer la DestroyWindow fonction. Son lorsque cette DestroyWindow fonction est appelée que le WM_DESTROY message est envoyé. Notez que le WM_CLOSE est seulement un message vous demandant de fermer (comme WM_QUIT) - vous n'avez pas à quitter/cesser de fumer. Mais le WM_DESTROY message vous indique que votre fenêtre EST être fermées et détruites de sorte que vous devez nettoyer toutes les ressources, poignées etc..
Pas l'ensemble de l'application, mais à une boucle de message. Chaque thread peut avoir sa propre boucle de message, donc une application peut avoir plusieurs boucles de message.
Juste afin de ne pas se perdre dans les commentaires... n'oubliez pas WM_CANCEL. Lorsque vous cliquez sur le bouton fermer (x) sur une boîte de dialogue MFC, il va certainement envoyer WM_CLOSE. La valeur par défaut OnClose() fonction appellera ensuite la valeur par défaut (classe de base) OnCancel() fonction.
Toutefois, si vous tapez simplement le ESC clé, cela conduira à la fermeture de la boîte de dialogue, mais (aussi loin que je peux dire), sans générer de la WM_CLOSE événement, il va directement à la WM_CANCEL/OnCancel() mécanisme.
Par la présente, je inviter la communauté à élaborer sur ce... ou de les modifier dans l'élaboration de la accepté de répondre.
Au premier abord, nous allons discuter de WM_QUIT - la différence à partir d'un autre messages que ce n'est pas associée à la fenêtre. Il est utilisé par l'application. Par exemple cela peut être manipulé par des non-visible autonome serveur OLE (.exe, mais pas dans le proc comme .dll)
WM_CLOSE par msdn: "Une application peut demander à l'utilisateur la confirmation, avant la destruction d'une fenêtre" - il est utilisé comme notification de l'intention de fermer (vous pouvez rejeter cette intention).
WM_DESTROY - est un fait que la fenêtre se ferme et l'ensemble des ressources doit(!) être libéré.
WM_QUIT est fait par thread, et non par l'application.
oui, vous avez raison. Parler en général, ce message signale boucle d'événement pour arrêter la manipulation à tous, indépendamment de l'application ou de manière autonome fil.
Elles sont totalement différentes.
WM_CLOSE
est envoyé à la fenêtre lorsque "X" est pressé ou "Fermer" est choisi à partir du menu de la fenêtre. Si vous attrapez ce message c'est que votre appel comment la traiter - l'ignorer ou de fermer la fenêtre. Par défaut,WM_CLOSE
passé àDefWindowProc
causes de la fenêtre pour être détruit. Lorsque la fenêtre est détruiteWM_DESTROY
message est envoyé. Dans cette étape, en opposition àWM_CLOSE
, vous ne pouvez pas arrêter le processus, vous ne pouvez effectuer un nettoyage nécessaire. Mais rappelez-vous que quand vous attrapezWM_DESTROY
juste avant toutes les fenêtres enfants sont déjà détruits.WM_NCDESTROY
est d'envoyer juste après toutes les fenêtres enfants ont été détruites.WM_QUIT
message n'est pas lié à une fenêtre (l'hwnd
obtenu à partir deGetMessage
est NULLE et aucune procédure de fenêtre est appelée). Ce message indique que la boucle de message doit être arrêté et l'application devrait être fermé. LorsqueGetMessage
litWM_QUIT
elle retourne 0 pour indiquer que. Jetez un oeil à typique de la boucle de message extrait - la boucle est maintenue pendantGetMessage
renvoie zéro.WM_QUIT
peuvent être envoyées parPostQuitMessage
fonction. Cette fonction est généralement appelé lorsque la fenêtre principale reçoitWM_DESTROY
(voir typique de la procédure de fenêtre extrait de).WM_ENDSESSION
arrive. Est-ce à déclencher automatiquement WM_CLOSE / QUITTER / DÉTRUIRE ?Tout d'abord, la WM_CLOSE et WM_DESTROY messages sont associés avec windows alors que le WM_QUIT message est applicable à l'ensemble de l'application (bien thread) et le message n'est jamais reçus par le biais d'une procédure de fenêtre (
WndProc
de routine), mais seulement par laGetMessage
ouPeekMessage
fonctions.Dans votre
WndProc
de routine de l'DefWindowProc
fonction prend en charge le comportement par défaut de ces messages. Le WM_CLOSE messages de demandes que l'application doit fermer et le comportement par défaut est d'invoquer laDestroyWindow
fonction. Son lorsque cetteDestroyWindow
fonction est appelée que le WM_DESTROY message est envoyé. Notez que le WM_CLOSE est seulement un message vous demandant de fermer (comme WM_QUIT) - vous n'avez pas à quitter/cesser de fumer. Mais le WM_DESTROY message vous indique que votre fenêtre EST être fermées et détruites de sorte que vous devez nettoyer toutes les ressources, poignées etc..Juste afin de ne pas se perdre dans les commentaires... n'oubliez pas
WM_CANCEL
. Lorsque vous cliquez sur le bouton fermer (x) sur une boîte de dialogue MFC, il va certainement envoyerWM_CLOSE
. La valeur par défautOnClose()
fonction appellera ensuite la valeur par défaut (classe de base)OnCancel()
fonction.Toutefois, si vous tapez simplement le
ESC
clé, cela conduira à la fermeture de la boîte de dialogue, mais (aussi loin que je peux dire), sans générer de laWM_CLOSE
événement, il va directement à laWM_CANCEL/OnCancel()
mécanisme.Par la présente, je inviter la communauté à élaborer sur ce... ou de les modifier dans l'élaboration de la accepté de répondre.
Au premier abord, nous allons discuter de WM_QUIT - la différence à partir d'un autre messages que ce n'est pas associée à la fenêtre. Il est utilisé par l'application. Par exemple cela peut être manipulé par des non-visible autonome serveur OLE (.exe, mais pas dans le proc comme .dll)
WM_CLOSE par msdn: "Une application peut demander à l'utilisateur la confirmation, avant la destruction d'une fenêtre" - il est utilisé comme notification de l'intention de fermer (vous pouvez rejeter cette intention).
WM_DESTROY - est un fait que la fenêtre se ferme et l'ensemble des ressources doit(!) être libéré.