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.
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
Otros recursos
Referencia