Compartir a través de


Función PostThreadMessageA (winuser.h)

Envía un mensaje a la cola de mensajes del subproceso especificado. Devuelve sin esperar a que el subproceso procese el mensaje.

Sintaxis

BOOL PostThreadMessageA(
  [in] DWORD  idThread,
  [in] UINT   Msg,
  [in] WPARAM wParam,
  [in] LPARAM lParam
);

Parámetros

[in] idThread

Tipo: DWORD de

Identificador del subproceso al que se va a publicar el mensaje.

Se produce un error en la función si el subproceso especificado no tiene una cola de mensajes. El sistema crea la cola de mensajes de un subproceso cuando el subproceso realiza su primera llamada a una de las funciones User o GDI. Para obtener más información, vea la sección Comentarios.

La publicación de mensajes está sujeta a UIPI. El subproceso de un proceso solo puede publicar mensajes en colas de mensajes publicados de subprocesos en procesos de nivel de integridad menor o igual.

Este subproceso debe tener el privilegio SE_TCB_NAME para publicar un mensaje en un subproceso que pertenece a un proceso con el mismo identificador único local (LUID), pero está en un escritorio diferente. De lo contrario, la función produce un error y devuelve ERROR_INVALID_THREAD_ID.

Este subproceso debe pertenecer al mismo escritorio que el subproceso que realiza la llamada o a un proceso con el mismo LUID. De lo contrario, la función produce un error y devuelve ERROR_INVALID_THREAD_ID.

[in] Msg

Tipo: UINT

Tipo de mensaje que se va a publicar.

[in] wParam

Tipo: WPARAM de

Información adicional específica del mensaje.

[in] lParam

Tipo: LPARAM

Información adicional específica del mensaje.

Valor devuelto

Tipo: BOOL de

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

Si se produce un error en la función, el valor devuelto es cero. Para obtener información de error extendida, llame a GetLastError. GetLastError devuelve ERROR_INVALID_THREAD_ID si idThread no es un identificador de subproceso válido o si el subproceso especificado por idThread no tiene una cola de mensajes. GetLastError devuelve ERROR_NOT_ENOUGH_QUOTA cuando se alcanza el límite de mensajes.

Observaciones

Cuando uiPI bloquea un mensaje, se recupera con GetLastError, se establece en 5 (acceso denegado).

El subproceso en el que se publica el mensaje debe haber creado una cola de mensajes o, de lo contrario, se produce un error en la llamada a PostThreadMessage. Use el siguiente método para controlar esta situación.

  • Cree un objeto de evento y, a continuación, cree el subproceso.
  • Use la función waitForSingleObject de para esperar a que el evento se establezca en el estado señalado antes de llamar a PostThreadMessage.
  • En el subproceso al que se publicará el mensaje, llame a PeekMessage como se muestra aquí para forzar al sistema a crear la cola de mensajes.

    PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)

  • Establezca el evento para indicar que el subproceso está listo para recibir mensajes publicados.
El subproceso al que se publica el mensaje recupera el mensaje llamando a la función GetMessage o PeekMessage. El miembro de hwnd del MSG devuelto es NULL.

Los mensajes publicados por PostThreadMessage no están asociados a una ventana. Como regla general, los mensajes que no están asociados a una ventana no se pueden enviar mediante la función DispatchMessage. Por lo tanto, si el subproceso del destinatario está en un bucle modal (utilizado por Cuadro de mensajes o DialogBox), se perderán los mensajes. Para interceptar mensajes de subproceso mientras se encuentra en un bucle modal, use un enlace específico del subproceso.

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

Hay un límite de 10 000 mensajes publicados por cola de 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

El valor mínimo aceptable es 4000.

Nota

El encabezado winuser.h define PostThreadMessage 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 Conventions for Function Prototypes.

Requisitos

Requisito Valor
cliente mínimo admitido Windows 2000 Professional [solo aplicaciones de escritorio]
servidor mínimo admitido Windows 2000 Server [solo aplicaciones de escritorio]
de la plataforma de destino de Windows
encabezado de winuser.h (incluya Windows.h)
biblioteca de User32.lib
DLL de User32.dll
conjunto de API de ext-ms-win-ntuser-message-l1-1-0 (introducido en Windows 8)

Consulte también

conceptual de

GetCurrentThreadId

GetMessage

GetWindowThreadProcessId

msg

mensajes y colas de mensajes

otros recursos

PeekMessage

PostMessage

de referencia de

de suspensión

waitForSingleObject