delphi winapi messages

delphi - ¿Cómo definir mensajes de aplicación de base privada?



winapi messages (1)

Estuve usando mensajes privados en mi aplicación durante un año como este:

UM_APP_BASE = WM_APP; // WM_APP is declared as WM_APP = $8000; in "Controls" unit.

y luego definí mis mensajes privados:

UM_EXPLORER_MSG = UM_APP_BASE + 1; UM_LICENSE_CHANGE_MSG = UM_APP_BASE + 2; etc...

Y úsalos así en mi clase:

procedure UMLicenseChanged(var Message: TMessage); message UM_LICENSE_CHANGE_MSG;

(También utilizo RegisterWindowMessage para "hablar" con mis otras aplicaciones, pero esa es una historia diferente)

No recuerdo qué me hizo decidir utilizar WM_APP lugar de WM_USER como base en primer lugar.
La documentación dice:

La constante WM_USER se utiliza para distinguir entre los valores de los mensajes que están reservados para su uso por Windows y los valores que puede utilizar una aplicación para enviar mensajes dentro de una clase de ventana privada. Hay cinco rangos de números de mensaje:

Range Meaning 0 through WM_USER - 1 Messages reserved for use by Windows. WM_USER through 0x7FFF Integer messages for use by private window classes. 0x8000 through 0xBFFF Messages reserved for future use by Windows. 0xC000 through 0xFFFF String messages for use by applications. Greater than 0xFFFF Reserved by Windows for future use.

Lo que significa que WM_APP está "reservado para uso futuro de Windows". Por otro lado, Delphi usa CM_BASE = $B000; que está en ese rango. y también CN_BASE = $BC00;

¿Cómo defino el mensaje base para que no coincida con otros mensajes utilizados por los controles de Windows / Delphi / Other? ¿Qué mensaje base se prefiere como privado para mi aplicación? ¿y por qué?
¿Debo usar WM_USER lugar de WM_APP ? Tenga en cuenta que WM_USER base también se usa en CommCtrl por Windows, por ejemplo, TB_ENABLEBUTTON = WM_USER + 1 . etc ...

Necesito algunas ideas sobre este tema.

Leí esto en mi API de ayuda de Delphi (D5). Lo que obviamente es obsoleto!
Probablemente esta es la razón por la que he decidido usar WM_APP .
Aún así, una explicación sobre la diferencia entre los dos sería agradable :)


No estoy seguro de dónde proviene su información. La documentation MSDN dice:

0 a través de WM_USER –1
Mensajes reservados para uso del sistema.

WM_USER a través de 0x7FFF
Mensajes enteros para su uso por clases de ventana privada.

WM_APP (0x8000) a través de 0xBFFF
Mensajes disponibles para su uso por las aplicaciones.

0xC000 a 0xFFFF
Mensajes de cadena para uso de las aplicaciones.

Mayor que 0xFFFF
Reservado por el sistema.

Ahora, ¿cuál es la diferencia entre el rango WM_USER y el rango WM_APP ? Esto ha sido cubierto en muchos lugares. Por ejemplo, esto es lo que Raymond Chen tiene que decir .

0x400 .. 0x7FFF (WM_USER .. WM_APP-1): mensajes definidos por la clase.

Los significados de estos mensajes están determinados por el implementador de la clase de ventana. (Informalmente: por la persona que llama a RegisterClass para esa clase de ventana). Por ejemplo, el mensaje WM_USER + 1 significa TB_ENABLEBUTTON si la ventana es un control de la barra de herramientas, pero significa TTM_ACTIVATE si es un control de información sobre herramientas, y significa DM_SETDEFID si Es un cuadro de diálogo. Si creaste tu propio control, significaría algo completamente diferente. Dado que cualquiera puede crear un mensaje en este rango, el sistema operativo no sabe qué significan los parámetros y no puede realizar la clasificación automática.

0x8000 .. 0xBFFF (WM_APP ... MAXINTATOM-1): mensajes definidos por la aplicación.

El significado de estos mensajes está determinado por la aplicación que creó la ventana. (Informalmente: por la persona que llama a CreateWindow). Esta región de mensajes se creó en Windows 95 para garantizar que las aplicaciones que subclasifican una ventana y generan mensajes personalizados no interfieran con los nuevos mensajes creados por la clase de ventana en futuras versiones. Nuevamente, dado que cualquiera puede crear un mensaje en este rango, el sistema operativo no sabe qué significan los parámetros y no puede realizar la clasificación automática.

Lo más importante de todo esto es que si define mensajes en el rango WM_USER , entonces prepárese para que otros controles en su aplicación tengan su propio uso para esos mismos mensajes. Por ejemplo, no debe transmitir mensajes en el rango WM_USER .

Por otro lado, los mensajes en el rango WM_APP están destinados a tener el mismo significado para todas las diferentes clases de ventanas en una aplicación.