2009-11-29 25 views
9

¿Hay alguna manera de definir y enviar tipos de mensajes personalizados en Win32, para ser captados por su controlador de mensajes principal? Por ejemplo, mi controlador principal de mensajes captura mensajes como WM_PAINT, WM_RESIZE, WM_LBUTTONDOWN, etc. ¿Puedo crear mi propio WM_DOSOMETHING? Si es así, ¿cómo enviaría este mensaje?¿Crear tipos de mensajes personalizados en win32?

Ah, de hecho acabo de descubrir que esto se le preguntó antes de here, sin embargo, no responde cómo realmente enviaría este mensaje.

Respuesta

13

Sí. Simplemente declare una constante en el rango WM_USER, p.

#define WM_RETICULATE_SPLINES (WM_USER + 0x0001) 

También puede registrar un mensaje por nombre utilizando la API RegisterWindowMessage.

A continuación, puede enviar estos mensajes utilizando SendMessage, PostMessage o cualquiera de sus variantes.

+0

gracias! ¿Es necesario RegisterWindowMessage() si el mensaje se envía y se captura dentro de una sola aplicación? – BeeBand

+3

Si usa #define, asegúrese de usar paréntesis (WM_USER + 0x0001) para que la aritmética realizada en su nuevo número de mensaje (operaciones en modo bit, empaque en una palabra de orden superior, etc.) funcione correctamente. – Travis

+1

Y no, no necesita RegisterWindowMessage si solo hay una aplicación involucrada; solo si necesita dos aplicaciones para aceptar un solo número de mensaje. – Travis

13

Woah, vamos a parar y pensar aquí ...

En primer lugar, el propio Windows envía mensajes en el rango WM_USER+n, por eso se inventó WM_APP (descubrí esto de la manera difícil). Pero empeora ... no hay nada para detener las aplicaciones con mal comportamiento radiodifundiendoWM_USER+n o WM_APP+n mensajes, y como los seres humanos robaron el cristal de la estupidez infinita de los Dioses, esto de hecho sucede en el mundo real.

Por lo tanto, repita después de mí, el único mensaje seguro es uno que defino a mí mismo y solo puedo verme a mí mismo. Use RegisterWindowMessage. Y aun así, desconfía. Cuando necesito una cadena para definir un RegisterWindowMessage, utilizo GUIDGEN para crear la cadena y poner un prefijo específico de la aplicación legible para los humanos en el guioncito resultante para ayudarme a diferenciar varios mensajes en el código.

Apuesta por la estupidez de tus compañeros humanos: siempre es una apuesta ganadora.

Si desea información sobre este tema, consulte here. No, ese no es mi sitio web, es el de Joe Newcomer.

+0

"porque los seres humanos robaron el cristal de la estupidez infinita de los dioses", sin embargo, mejores humanos estúpidos que dioses estúpidos;) – Ben

1
  • Si creó la ventana clase, puede utilizar la gama WM_USER (o WM_APP)
  • Si no es su clase, puede utilizar WM_APP
  • Si desea difundir el mensaje a cada ventana de nivel superior, registre su propio mensaje global con RegisterWindowMessage
Cuestiones relacionadas