Função PostMessageA (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 PostMessageA(
  [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
HWND_BROADCAST
((HWND)0xffff)
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.
NULO
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.

Uma fila de mensagens pode conter no máximo 10.000 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

GetMessage

Mensagens e filas de mensagens

PeekMessage

Postquitmessage

Postthreadmessage

Referência

Registerwindowmessage

SendMessageCallback

Sendnotifymessage