Função PostThreadMessageW (winuser.h)
Posta uma mensagem na fila de mensagens do thread especificado. Ele retorna sem esperar que o thread processe a mensagem.
Sintaxe
BOOL PostThreadMessageW(
[in] DWORD idThread,
[in] UINT Msg,
[in] WPARAM wParam,
[in] LPARAM lParam
);
Parâmetros
[in] idThread
Tipo: DWORD
O identificador do thread no qual a mensagem deve ser postada.
A função falhará se o thread especificado não tiver uma fila de mensagens. O sistema cria a fila de mensagens de um thread quando o thread faz sua primeira chamada para uma das funções de Usuário ou GDI. Para obter mais informações, consulte a seção Comentários.
A postagem de mensagens está sujeita à UIPI. O thread de um processo pode postar mensagens apenas em filas de threads de mensagens postadas em processos de nível de integridade menor ou igual.
Esse thread deve ter o privilégio SE_TCB_NAME para postar uma mensagem em um thread que pertence a um processo com o mesmo LUID (identificador local exclusivo), mas está em uma área de trabalho diferente. Caso contrário, a função falhará e retornará ERROR_INVALID_THREAD_ID.
Esse thread deve pertencer à mesma área de trabalho que o thread de chamada ou a um processo com o mesmo LUID. Caso contrário, a função falhará e retornará ERROR_INVALID_THREAD_ID.
[in] Msg
Tipo: UINT
O tipo de mensagem a ser postada.
[in] wParam
Tipo: WPARAM
Informações adicionais específicas da mensagem.
[in] lParam
Tipo: LPARAM
Informações adicionais específicas da mensagem.
Valor de retorno
Tipo: BOOL
Se a função for bem-sucedida, o valor retornado não será zero.
Se a função falhar, o valor retornado será zero. Para obter informações de erro estendidas, chame GetLastError. GetLastError retornará ERROR_INVALID_THREAD_ID se idThread não for um identificador de thread válido ou se o thread especificado por idThread não tiver uma fila de mensagens. GetLastError retorna ERROR_NOT_ENOUGH_QUOTA quando o limite da mensagem é atingido.
Observações
Quando uma mensagem é bloqueada pela UIPI, o último erro, recuperado com GetLastError, é definido como 5 (acesso negado).
O thread no qual a mensagem é postada deve ter criado uma fila de mensagens ou então a chamada para PostThreadMessage falha. Use o método a seguir para lidar com essa situação.
- Crie um objeto de evento e, em seguida, crie o thread.
-
Use a função WaitForSingleObject
para aguardar que o evento seja definido como o estado sinalizado antes de chamar PostThreadMessage . -
No thread no qual a mensagem será postada, chame PeekMessage conforme mostrado aqui para forçar o sistema a criar a fila de mensagens.
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)
- Defina o evento para indicar que o thread está pronto para receber mensagens postadas.
As mensagens postadas por postThreadMessage não estão associadas a uma janela. Como regra geral, as mensagens que não estão associadas a uma janela não podem ser expedidas pela função
O sistema só faz marshalling para mensagens do sistema (aquelas no intervalo de 0 a (WM_USER-1)). Para enviar outras mensagens (aquelas >= WM_USER) para outro processo, você deve fazer o marshalling personalizado.
Há um limite de 10.000 mensagens postadas por fila de mensagens. Esse limite deve ser suficientemente grande. Se o aplicativo exceder o limite, ele deverá ser redesenhado para evitar o consumo de tantos recursos do sistema. Para ajustar esse limite, modifique a seguinte chave do Registro.
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Windows USERPostMessageLimit
O valor mínimo aceitável é 4000.
Nota
O cabeçalho winuser.h define PostThreadMessage como um alias que seleciona automaticamente a versão ANSI ou Unicode dessa função com base na definição da constante do pré-processador UNICODE. A combinação do uso do alias neutro de codificação com código que não é neutro em codificação pode levar a incompatibilidades que resultam em erros de compilação ou de runtime. Para obter mais informações, consulte Conventions for Function Prototypes.
Requisitos
Requisito | Valor |
---|---|
de cliente com suporte mínimo | Windows 2000 Professional [somente aplicativos da área de trabalho] |
servidor com suporte mínimo | Windows 2000 Server [somente aplicativos da área de trabalho] |
da Plataforma de Destino |
Windows |
cabeçalho | winuser.h (inclua Windows.h) |
biblioteca | User32.lib |
de DLL |
User32.dll |
conjunto de API | ext-ms-win-ntuser-message-l1-1-0 (introduzido no Windows 8) |
Consulte também
Conceitual
GetWindowThreadProcessId
mensagens e filas de mensagens
outros recursos
de referência de