Red de conocimiento informático - Problemas con los teléfonos móviles - Implementar el mecanismo de procesamiento de mensajes de Windows para mensajes

Implementar el mecanismo de procesamiento de mensajes de Windows para mensajes

¿Cómo aparecen Windows Forms en la pantalla?

DrawText dibuja texto

DrawEdge dibuja borde

DrawIcon dibuja icono

Bitmap dibuja mapa de bits

Rectángulo dibuja Rectángulo

....

Implementación de mensajes del mecanismo de procesamiento de mensajes de Windows p>

Rectángulo dibuja un rectángulo

...

Estas funciones implementan interfaces de programa más complejas.

Entonces, ¿cuándo llamamos a estas funciones? Obviamente, necesitamos un centro de control para "dar órdenes", y también necesitamos un mecanismo de entrega de comandos para entregar comandos a sus destinos instantáneamente. Este centro de control es una fuente de energía, al igual que el corazón, que suministra sangre continuamente a varios lugares. Este mecanismo de entrega de comandos es el mecanismo de mensajería de Windows, y la mensajería de Windows es como la sangre en el cuerpo humano, el mensajero para la entrega de comandos.

El centro de control de mensajes de Windows generalmente tiene una estructura de tres capas. La capa superior es el núcleo de Windows. El núcleo de Windows mantiene una cola de mensajes. El centro de control de la segunda capa obtiene los mensajes bajo su propia jurisdicción. cola de mensajes y los procesa Finalmente, algunos mensajes se procesan directamente y otros se envían al formulario del siguiente nivel (Ventana) o control (Control). Algunos mensajes se procesan directamente, mientras que otros se envían al siguiente nivel de formulario (ventana) o control (control). El centro de control de segundo nivel suele ser el objeto de aplicación para cada aplicación de Windows. El centro de control de tercer nivel es el objeto de Windows Forms. Cada formulario tiene un proceso de formulario predeterminado, que es responsable de manejar varios mensajes entrantes. Como se muestra en la siguiente figura:

(Nota: Windows se refiere al sistema operativo Windows; ventana: ventana; formulario: incluye la ventana y el identificador del control; control se refiere al control en sí, que puede ser una ventana, o probablemente no; la aplicación es la aplicación y no puede usarse en la aplicación). Mecanismo de mensajería de Windows (aquí analizamos específicamente aplicaciones con bucles de mensajes)

Los mensajes se entregan a las aplicaciones en una estructura fija, cuya estructura es la siguiente:

MSG de tipo público

hwnd As Long

mensaje As Long

wParam As Long

lParam As Long

tiempo As Long

pt As POINTAPI

Tipo de fin

Entre ellos, hwnd es el identificador del formulario y mensaje es la constante del mensaje que representa el tipo de mensaje. Tanto wParam como lParam son información adicional de 32 bits. Según el tipo de mensaje y el contenido específico del mensaje, la hora es la hora en que se envía el mensaje y pt es la posición del mouse cuando se envía el mensaje.

El sistema operativo Windows incluye los siguientes tipos de mensajes:

1. Mensajes estándar de Windows:

Estos mensajes comienzan con WM_.

2. Mensajes de notificación

Los mensajes de notificación son mensajes de controles estándar de Windows. Estos controles incluyen: botón (Button), cuadro combinado (ComboBox), cuadro de edición (TextBox), cuadro de lista (ListBox), control ListView, control de vista de árbol, barra de herramientas (Toolbar), menú (Menú), etc. Cada tipo de mensaje comienza con una cadena diferente.

3. Mensajes personalizados

Los programadores también pueden personalizar los mensajes. No todos los controles pueden recibir mensajes, reenviar mensajes y dibujarse a sí mismos, sólo los controles con identificadores pueden hacer esto.

Los controles con identificadores son esencialmente ventanas y pueden existir de forma independiente y actuar como contenedores para otros controles. Los controles sin identificadores (como Etiqueta) no pueden existir de forma independiente y solo pueden actuar como controles secundarios de los controles de ventana, mientras que los controles de ventana no pueden dibujarse por sí mismos. en el formulario principal para dibujar.

La esencia de un identificador es un valor de 32 bits que el sistema mantiene automáticamente y es único en un momento dado en todo el sistema operativo. Sin embargo, cuando se libera el formulario representado por el identificador, el identificador también se libera y el valor, a su vez, puede ser utilizado por otras formas. En otras palabras, el valor del identificador es dinámico y en sí mismo es solo un identificador único que el sistema operativo utiliza para identificar y encontrar el objeto que representa.

Sin embargo, no todos los controladores son controladores de formulario; existen muchos otros tipos de controladores en Windows, como controladores de lienzo (hdc), controladores de lápiz, controladores de pincel, controladores de aplicación (hInstance), etc. Estos identificadores no pueden recibir mensajes. Pero no importa qué tipo de identificador, es el identificador único del objeto en el sistema. En este artículo, solo discutiremos los identificadores de formulario.

Entonces, ¿por qué las manijas dan a las ventanas características tan únicas? De hecho, todo esto se debe al mensaje. Gracias al identificador, el formulario puede recibir mensajes, saber cuándo dibujar sus propios controles y subcontroles, saber cuándo hace clic el mouse en qué parte de la ventana y manejarlo en consecuencia. Un identificador es como el documento de identidad de una persona. Con él, puedes participar en diversas actividades sociales; de lo contrario, serás una persona turbia en la sociedad o seguirás a otros y demostrarás tu existencia a través de otros. 1. Obtener mensajes de la cola de mensajes:

Puedes obtener mensajes de la cola de mensajes de Windows a través de la función PeekMessage o GetMessage. Las colas de mensajes guardadas por Windows están agrupadas por subprocesos, es decir, cada hilo tiene su propia cola de mensajes.

2. Enviar un mensaje

El envío de un mensaje a un formulario específico generalmente se completa mediante las dos funciones siguientes: La diferencia entre estas dos funciones es que la función PostMessage solo lo agrega a la cola de mensajes del hilo. Si un mensaje se agrega correctamente, devuelve Verdadero; de lo contrario, devuelve Falso, ya sea que se procese el mensaje o la cola de mensajes. Se desconoce si se procesa el mensaje o el resultado. SendMessage es un poco diferente en el sentido de que no agrega el mensaje a la cola, sino que lo traduce directamente y llama al procesamiento del mensaje (el hilo simplemente se envía el mensaje a sí mismo) y no regresa hasta que se completa el procesamiento del mensaje. Por tanto, si queremos que el mensaje enviado se ejecute inmediatamente, debemos llamar a SendMessage.

Una cosa más es que el mensaje enviado por SendMessage no se agregará a la cola de mensajes porque no se agregará a la cola de mensajes (error: un hilo que envía un mensaje a otro hilo también se agregará a la cola de mensajes) La cola de envío de mensajes de otro hilo, incluso si los dos hilos están en el mismo proceso), por lo que el mensaje enviado por SendMessage no se puede obtener a través de PeekMessage o GetMessage.

Además, algunos mensajes no se pueden enviar usando PostMessage, como wm_settext, por lo que no todos los mensajes se pueden enviar usando PostMessage.

Existen otras funciones API para enviar mensajes, como PostThreadMessage, SendMessageCallback, SendMessageTimeout, SendNotifyMessage, etc. El bucle de mensajes es la razón fundamental por la que su aplicación puede seguir ejecutándose. Si el bucle sale, la aplicación finaliza.

Echemos un vistazo a cómo Delphi encapsula el bucle de mensajes:

Paso 1: El programa comienza a ejecutarse (Ejecutar)

Application.Initialize // Inicialización;

Application.CreateForm(TForm1, Form1); //Crea el formulario principal

Application.Run; //Comienza a ejecutar y prepárate para el bucle de mensajes

La aplicación puede existir y ejecutarse si no se crea el formulario principal.

Paso 2: Comience a llamar al bucle de mensajes (HandleMessage)

Procesar TApplication.Run;