[C con Clase] Parámetros de WM QUIT y PostQuitMessage() en WinAPI

Salvador Pozo salvador en conclase.net
Jue Jul 17 11:27:36 CEST 2008


El pasado 2008-07-17 04:07:47, David Reza escribió:
 
Hola:

Bueno, para empezar debo decir que cometí un error en lo que respecta a las formas de enviar mensajes.

Mediante post se envían mensajes a la cola de mensajes. Con send se envían directamente al procedimiento de ventana.

De modo que sólo los mensajes enviados mediante post son procesados por el bucle de mensajes.

Los mensajes enviados mediante send se procesan con mayor prioridad que cualquier mensaje que permanezca en la cola.

Dicho esto, vamos a tu duda.

Todo lo anterior no cambia mucho las cosas, el mensaje WM_QUIT se envía a la cola de mensajes. Cuando llegue su turno, la función GetMessage recuperará el mensaje de la cola, rellenando adecuadamente la estructura MSG y retornando con el valor FALSE.

DR> También se supone que esta función envía el mensaje 'WM_QUIT' al bucle de
DR> mensajes, pero, ¿lo hace de forma inmediata, saltándose cualquier otro
DR> mensaje que hubiese en la cola de mensajes, o se va al final de la cola de
DR> mensajes?

Como he explicado antes, se envía a la cola, al final.

DR> Sigue con la siguiente instrucción? En mi caso 'return mensaje.wParam;'
DR> El 'wParam' supongo que pertence a la estructura MSG o tag_MSG. Pero como ya
DR> he mencionado, el curso muestra algo así:
DR> WM_QUIT
DR> > nExitCode = (int) wParam;
DR> >
DR> Y a mi modo de entender, las cosas deberían ser al revés:
DR> wParam = nExitCode;
DR> para que de esta manera, el valor de 'nExitCode' ( pasado por parámetro a la
DR> función 'PostQuitMessage()' ) se asigne a el campo 'wParam' de la variable
DR> de estructura declarada al principio, es decir, 'mensaje'.
DR> Si ésto no es así, agradecería una explicación.

Creo que estamos confundiendo conceptos.

El orden es el expuesto. Cuando la aplicación debe terminar se envía un mensaje WM_QUIT mediante la función PostQuitMessage, indicando en el parámetro el valor del código de salida.

El mensaje se coloca en la cola de mensajes, junto con los valores de wParam y lParam. El valor usado para lParam es irrelevante, ya que este mensaje no lo usa.

En un momento dado, la función GetMessage, dentro del bucle de mensajes, recupera el mensaje WM_QUIT, y asigna los valores de wParam y lParam de la estructura MSG desde los valores almacenados en la cola de mensajes.

GetMessage regresa con FALSE, el bucle termina y WinMain regresa usando el valor de wParam de la estructura MSG como valor de retorno.

Insisto en que la documentación de los mensajes no se debe interpretar literalmente como código C. Podríamos haber documentado el mensaje de igual forma:

WM_QUIT
 CodigoSalida = (int) wParam;

Esto sólo indica que cuando se recibe un mensaje WM_QUIT, el valor del parámetro wParam debe interpretarse como el código de salida.

Análogamente, si enviamos el mensaje WM_QUIT usando una función más genérica, como PostMessage, nos indica que debemos colocar el valor de salida en el parámetro wParam.

En realidad, PostQuitMessage se puede sustituir por PostMessage:

VOID PostQuitMessage(int nExitCode) {
   PostMessage(hWnd, WM_QUIT, nExitCode, 0);
}

Donde hWnd debe ser el manipulador de ventana desde donde se invoca a la función.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase