2009-11-29 3 views
9

Existe-t-il un moyen de définir et d'envoyer des types de message personnalisés dans Win32, pour être interceptés par votre gestionnaire de messages principal? Par exemple, mon gestionnaire de messages principal capture des messages tels que WM_PAINT, WM_RESIZE, WM_LBUTTONDOWN, etc. Puis-je créer mon propre WM_DOSOMETHING? Si oui, comment pourrais-je envoyer ce message?Création de types de message personnalisés dans win32?

Ah, je viens de découvrir que cela a été demandé avant here, cependant, il ne répond pas comment j'aurais réellement envoyer ce message.

Répondre

13

Oui. Déclarez simplement une constante dans la plage WM_USER, par ex.

#define WM_RETICULATE_SPLINES (WM_USER + 0x0001) 

Vous pouvez également enregistrer un message par son nom à l'aide de l'API RegisterWindowMessage.

Vous pouvez ensuite envoyer ces messages en utilisant SendMessage, PostMessage ou l'une de leurs variantes.

+0

merci! Est-il nécessaire de RegisterWindowMessage() si le message est envoyé et capturé dans une seule application? – BeeBand

+3

Si vous utilisez #define, assurez-vous d'utiliser des parenthèses autour de (WM_USER + 0x0001) afin que l'arithmétique effectuée sur votre nouveau numéro de message (opérations au niveau du bit, intégration dans un mot de poids fort, etc.) fonctionne correctement. – Travis

+1

Et non, vous n'avez pas besoin de RegisterWindowMessage s'il n'y a qu'une seule application impliquée; uniquement si vous avez besoin de deux applications pour convenir d'un seul numéro de message. – Travis

13

Woah, nous allons tout simplement arrêter et penser ici ...

Tout d'abord, Windows lui-même envoie des messages dans la gamme WM_USER+n, c'est pourquoi WM_APP a été inventé (j'ai trouvé ceci à la dure). Mais ça devient pire ... il n'y a rien pour arrêter les applications mal conduites diffuserWM_USER+n ou WM_APP+n messages, et parce que les êtres humains ont volé aux dieux le cristal d'une stupidité infinie, cela arrive effectivement dans le monde réel. Alors, répétez après moi, le seul message sûr est celui que je me définis et que je ne peux me voir que moi-même. Utilisez RegisterWindowMessage. Et même alors, soyez méfiant. Lorsque j'ai besoin d'une chaîne pour définir un RegisterWindowMessage, j'utilise GUIDGEN pour créer la chaîne et mettre un préfixe spécifique à l'application lisible par l'utilisateur sur le gobbledygook résultant pour m'aider à différencier plusieurs messages dans le code. Pariez sur la stupidité de vos semblables - c'est toujours un pari gagnant.

Si vous voulez un arrière-plan faisant autorité sur l'ensemble de ce sujet, voir here. Non, ce n'est pas mon site web, c'est Joe Newcomer.

+0

"parce que les êtres humains ont volé aux dieux le cristal de la stupidité infinie" Mieux que des idiots stupides que des dieux stupides, cependant;) – Ben

1
  • Si vous avez créé la fenêtre classe, vous pouvez utiliser la gamme WM_USER (ou WM_APP)
  • Si ce n'est pas votre classe, vous pouvez utiliser WM_APP
  • Si vous souhaitez diffuser le message chaque fenêtre de niveau supérieur, enregistrez votre propre message global avec RegisterWindowMessage
Questions connexes