Função PostMessageW (winuser.h)
Places (posta) uma mensagem na fila de mensagens associada ao thread que criou a janela especificada e retorna sem esperar que o thread processe a mensagem.
Para postar uma mensagem na fila de mensagens associada a um thread, use a função PostThreadMessage .
Sintaxe
BOOL PostMessageW(
[in, optional] HWND hWnd,
[in] UINT Msg,
[in] WPARAM wParam,
[in] LPARAM lParam
);
Parâmetros
[in, optional] hWnd
Digite: HWND
Um identificador para a janela cujo procedimento de janela é receber a mensagem. Os valores a seguir têm significados especiais.
Valor | Significado |
---|---|
|
A mensagem é postada em todas as janelas de nível superior do sistema, incluindo janelas desabilitadas ou invisíveis sem proprietário, janelas sobrepostas e janelas pop-up. A mensagem não é postada em janelas filho. |
|
A função se comporta como uma chamada para PostThreadMessage com o parâmetro dwThreadId definido como o identificador do thread atual. |
A partir do Windows Vista, a postagem de mensagens está sujeita à UIPI. O thread de um processo pode postar mensagens apenas em filas de mensagens de threads em processos de nível de integridade menor ou igual.
[in] Msg
Tipo: UINT
A mensagem a ser postada.
Para obter listas das mensagens fornecidas pelo sistema, consulte Mensagens definidas pelo sistema.
[in] wParam
Tipo: WPARAM
Obter informações adicionais específicas de mensagem.
[in] lParam
Tipo: LPARAM
Obter informações adicionais específicas de mensagem.
Retornar valor
Tipo: BOOL
Se a função for bem-sucedida, o valor retornado será diferente de zero.
Se a função falhar, o valor retornado será zero. Para obter informações de erro estendidas, chame GetLastError.
Comentários
Quando uma mensagem é bloqueada pela UIPI, o último erro, recuperado com GetLastError, é definido como 5 (acesso negado).
As mensagens em uma fila de mensagens são recuperadas por chamadas para a função GetMessage ou PeekMessage .
Os aplicativos que precisam se comunicar usando HWND_BROADCAST devem usar a função RegisterWindowMessage para obter uma mensagem exclusiva para comunicação entre aplicativos.
O sistema só faz marshaling para mensagens do sistema (aquelas no intervalo de 0 a (WM_USER-1)). Para enviar outras mensagens (essas >= WM_USER) para outro processo, você deve fazer marshalling personalizado.
Se você enviar uma mensagem no intervalo abaixo WM_USER para as funções de mensagem assíncronas (PostMessage, SendNotifyMessage e SendMessageCallback), seus parâmetros de mensagem não poderão incluir ponteiros. Caso contrário, a operação falhará. As funções retornarão antes que o thread de recebimento tenha tido a chance de processar a mensagem e o remetente liberará a memória antes de ser usada.
Não poste a mensagem WM_QUIT usando PostMessage; use a função PostQuitMessage .
Um aplicativo de acessibilidade pode usar PostMessage para postar mensagens WM_APPCOMMAND no shell para iniciar aplicativos. Não há garantia de que essa funcionalidade funcione para outros tipos de aplicativos.
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 reprojetado 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
Se a função falhar, chame GetLastError para obter informações de erro estendidas. GetLastError retorna ERROR_NOT_ENOUGH_QUOTA quando o limite é atingido.
O valor mínimo aceitável é 4000.
Exemplos
O exemplo a seguir mostra como postar uma mensagem de janela privada usando a função PostMessage . Suponha que você tenha definido uma mensagem de janela privada chamada WM_COMPLETE:
#define WM_COMPLETE (WM_USER + 0)
Você pode postar uma mensagem na fila de mensagens associada ao thread que criou a janela especificada, conforme mostrado abaixo:
WaitForSingleObject (pparams->hEvent, INFINITE) ;
lTime = GetCurrentTime () ;
PostMessage (pparams->hwnd, WM_COMPLETE, 0, lTime);
Para obter mais exemplos, consulte Iniciando um link de dados.
Observação
O cabeçalho winuser.h define PostMessage como um alias que seleciona automaticamente a versão ANSI ou Unicode dessa função com base na definição da constante de pré-processador UNICODE. Misturar o uso do alias neutro de codificação com código que não seja neutro em codificação pode levar a incompatibilidades que resultam em erros de compilação ou de runtime. Para obter mais informações, consulte Convenções para protótipos de função.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows 2000 Professional [somente aplicativos da área de trabalho] |
Servidor mínimo com suporte | Windows 2000 Server [somente aplicativos da área de trabalho] |
Plataforma de Destino | Windows |
Cabeçalho | winuser.h (inclua Windows.h) |
Biblioteca | User32.lib |
DLL | User32.dll |
Conjunto de APIs | ext-ms-win-ntuser-message-l1-1-0 (introduzido em Windows 8) |
Confira também
Conceitual
Mensagens e filas de mensagens
Referência