Share via


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

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, se produce un error en la función 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, se produce un error en la función y devuelve ERROR_INVALID_THREAD_ID.

[in] Msg

Tipo: UINT

Tipo de mensaje que se va a publicar.

[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. 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.

Comentarios

Cuando un mensaje está bloqueado por UIPI, el último error, recuperado 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 método siguiente para controlar esta situación.

  • Cree un objeto de evento y, a continuación, cree el subproceso.
  • Use la función WaitForSingleObject para esperar a que el evento se establezca en el estado señalado antes de llamar a PostThreadMessage.
  • En el subproceso en el 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 en el que se publica el mensaje recupera el mensaje mediante una llamada a la función GetMessage o PeekMessage . El miembro hwnd de la estructura MSG devuelta es NULL.

Los mensajes publicados por PostThreadMessage no están asociados a una ventana. Como regla general, la función DispatchMessage no puede enviar los mensajes que no están asociados a una ventana. Por lo tanto, si el subproceso del destinatario está en un bucle modal (como lo usa MessageBox o DialogBox), los mensajes se perderán. 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 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.

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 Convenciones para prototipos de función.

Requisitos

   
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

GetCurrentThreadId

GetMessage

GetWindowThreadProcessId

MSG

Mensajes y colas de mensajes

Otros recursos

PeekMessage

PostMessage

Referencia

Sleep

Waitforsingleobject