Diferentes tipos de OS manejador de interrupciones debe ser la colocación de mensajes en dicha cola de mensajes' ', pero ¿dónde reside el espacio de direcciones del proceso? ¿Cómo está expuesto al código del controlador de interrupción?
Las ventanas están asociadas a los hilos. Cada hilo con una ventana tiene una cola de hilos en el espacio de direcciones del proceso. El sistema operativo tiene una cola interna en su propio espacio de direcciones para los eventos generados por hardware. Usando detalles del evento y otra información de estado (por ejemplo, qué ventana tiene el foco), el sistema operativo traduce los eventos de hardware en mensajes que luego se colocan en la fila de hilos adecuada.
Los mensajes que se publican se colocan directamente en la cola de subprocesos para la ventana de destino.
Los mensajes que se envían generalmente se procesan directamente (omitiendo la cola).
Los detalles se ponen peludos. Por ejemplo, las colas de subprocesos son más que listas de mensajes; también mantienen cierta información de estado. Algunos mensajes (como WM_PAINT) no están realmente en cola, sino que se sintetizan a partir de la información de estado adicional cuando consulta la cola y está vacía. Los mensajes enviados a ventanas propiedad de otros hilos se publican en la cola del receptor en lugar de procesarse directamente, pero el sistema hace que parezca un envío de bloqueo regular desde el punto de vista de la persona que llama. La hilaridad se produce si esto puede causar un punto muerto (debido a los envíos circulares de vuelta al hilo original).
Los libros de Jeffrey Richter tienen mucho (¿todo?) De los detalles sangrientos. Mi edición es antigua (Windows avanzado). La edición actual parece llamarse Windows via C/C++.
El sistema operativo realiza MUCHO trabajo para hacer que la secuencia de mensajes parezca racional (y relativamente simple) para la persona que llama.
¿Qué significa 'traducir' el mensaje? ¿Qué hace realmente la llamada a TranslateMessage()?
Busca mensajes de teclas virtuales y, cuando reconoce una combinación de combinación de teclas, agrega mensajes de caracteres. Si no llama al TranslateMessage, no recibirá mensajes de caracteres como WM_CHAR.
Sospecho que envía el mensaje del personaje directamente antes de regresar (en lugar de publicarlo). Nunca lo he comprobado, pero parece recordar que los mensajes WM_CHAR llegan justo antes de WM_KEYUP.
Una vez enviado por DispatchMessage(), ¿en qué lugar pasa el mensaje antes de llegar a mi WndProc (es decir, qué hace el sistema operativo con él)?
DispatchMessage pasa el mensaje al WndProc para la ventana de destino. En el camino, algunos ganchos pueden tener la oportunidad de ver el mensaje (y posiblemente interferir con él).
Esto está todo mal. Las partes correctas son correctas solo si la pregunta era sobre Win16, donde todo el sistema operativo y las aplicaciones se programaban de forma cooperativa en un solo hilo. –