Compartir a través de


Función PostMessageA (winuser.h)

Places (publica) un mensaje en la cola de mensajes asociada al subproceso que creó la ventana especificada y devuelve sin esperar a que el subproceso procese el mensaje.

Para publicar un mensaje en la cola de mensajes asociada a un subproceso, use la función PostThreadMessage .

Sintaxis

BOOL PostMessageA(
  [in, optional] HWND   hWnd,
  [in]           UINT   Msg,
  [in]           WPARAM wParam,
  [in]           LPARAM lParam
);

Parámetros

[in, optional] hWnd

Tipo: HWND

Identificador de la ventana cuyo procedimiento de ventana va a recibir el mensaje. Los valores siguientes tienen significados especiales.

Valor Significado
HWND_BROADCAST
((HWND)0xffff)
El mensaje se publica en todas las ventanas de nivel superior del sistema, incluidas las ventanas deshabilitadas o invisibles, las ventanas superpuestas y las ventanas emergentes. El mensaje no se publica en ventanas secundarias.
NULL
La función se comporta como una llamada a PostThreadMessage con el parámetro dwThreadId establecido en el identificador del subproceso actual.
 

A partir de Windows Vista, la publicación de mensajes está sujeta a UIPI. El subproceso de un proceso solo puede publicar mensajes en colas de mensajes de subprocesos en procesos de nivel de integridad menor o igual.

[in] Msg

Tipo: UINT

Mensaje que se va a publicar.

Para obtener listas de los mensajes proporcionados por el sistema, vea Mensajes definidos por el sistema.

[in] wParam

Tipo: WPARAM

Información adicional específica del mensaje.

[in] lParam

Tipo: LPARAM

Información adicional específica del mensaje.

Valor devuelto

Tipo: BOOL

Si la función se realiza correctamente, el valor devuelto es distinto de cero.

Si la función no se realiza correctamente, el valor devuelto es cero. Para obtener información de error extendida, llame a GetLastError.

Comentarios

Cuando un mensaje está bloqueado por UIPI, el último error, recuperado con GetLastError, se establece en 5 (acceso denegado).

Los mensajes de una cola de mensajes se recuperan mediante llamadas a la función GetMessage o PeekMessage .

Las aplicaciones que necesitan comunicarse mediante HWND_BROADCAST deben usar la función RegisterWindowMessage para obtener un mensaje único para la comunicación entre aplicaciones.

El sistema solo realiza la serialización de los mensajes del sistema (los del intervalo de 0 a (WM_USER-1)). Para enviar otros mensajes (aquellos >= WM_USER) a otro proceso, debe realizar la serialización personalizada.

Si envía un mensaje en el intervalo siguiente WM_USER a las funciones de mensaje asincrónicas (PostMessage, SendNotifyMessage y SendMessageCallback), sus parámetros de mensaje no pueden incluir punteros. De lo contrario, la operación presentará un error. Las funciones devolverán antes de que el subproceso receptor haya tenido la oportunidad de procesar el mensaje y el remitente liberará la memoria antes de que se use.

No publique el mensaje de WM_QUIT mediante PostMessage; use la función PostQuitMessage .

Una aplicación de accesibilidad puede usar PostMessage para publicar mensajes WM_APPCOMMAND en el shell para iniciar aplicaciones. No se garantiza que esta funcionalidad funcione para otros tipos de aplicaciones.

Una cola de mensajes puede contener como máximo 10 000 mensajes. Este límite debe ser lo suficientemente grande. Si la aplicación supera el límite, se debe rediseñar para evitar consumir tantos recursos del sistema. Para ajustar este límite, modifique la siguiente clave del Registro.

HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows NT
            CurrentVersion
               Windows
                  USERPostMessageLimit

Si se produce un error en la función, llame a GetLastError para obtener información de error extendida. GetLastError devuelve ERROR_NOT_ENOUGH_QUOTA cuando se alcanza el límite.

El valor mínimo aceptable es 4000.

Ejemplos

En el ejemplo siguiente se muestra cómo publicar un mensaje de ventana privada mediante la función PostMessage . Supongamos que ha definido un mensaje de ventana privada denominado WM_COMPLETE:

#define        WM_COMPLETE     (WM_USER + 0)

Puede publicar un mensaje en la cola de mensajes asociada al subproceso que creó la ventana especificada, como se muestra a continuación:

 WaitForSingleObject (pparams->hEvent, INFINITE) ;
 lTime = GetCurrentTime () ;
 PostMessage (pparams->hwnd, WM_COMPLETE, 0, lTime);

Para obtener más ejemplos, consulte Iniciar un vínculo de datos.

Nota

El encabezado winuser.h define PostMessage como alias que selecciona automáticamente la versión ANSI o Unicode de esta función en función de la definición de la constante de preprocesador UNICODE. La combinación del uso del alias neutral de codificación con código que no es neutral de codificación puede dar lugar a errores de coincidencia que dan lugar a errores de compilación o tiempo de ejecución. Para obtener más información, vea Convenciones para prototipos de función.

Requisitos

Requisito Value
Cliente mínimo compatible Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows 2000 Server [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado winuser.h (incluir Windows.h)
Library User32.lib
Archivo DLL User32.dll
Conjunto de API ext-ms-win-ntuser-message-l1-1-0 (introducido en Windows 8)

Consulte también

Conceptual

GetMessage

Mensajes y colas de mensajes

PeekMessage

PostQuitMessage

PostThreadMessage

Referencia

RegisterWindowMessage

SendMessageCallback

SendNotifyMessage