Função SetWindowsHookExA (winuser.h)
Instala um procedimento de gancho definido pelo aplicativo em uma cadeia de ganchos. Você instalaria um procedimento de gancho para monitorar o sistema para determinados tipos de eventos. Esses eventos são associados a um thread específico ou a todos os threads na mesma área de trabalho que o thread de chamada.
Sintaxe
HHOOK SetWindowsHookExA(
[in] int idHook,
[in] HOOKPROC lpfn,
[in] HINSTANCE hmod,
[in] DWORD dwThreadId
);
Parâmetros
[in] idHook
Tipo: int
O tipo de procedimento de gancho a ser instalado. Esse parâmetro pode usar um dos valores a seguir.
Valor | Significado |
---|---|
|
Instala um procedimento de gancho que monitora mensagens antes que o sistema as envie para o procedimento de janela de destino. Para obter mais informações, consulte o procedimento de gancho CallWndProc . |
|
Instala um procedimento de gancho que monitora mensagens depois que elas são processadas pelo procedimento da janela de destino. Para obter mais informações, consulte o procedimento de gancho [função de retorno de chamada HOOKPROC](nc-winuser-hookproc.md). |
|
Instala um procedimento de gancho que recebe notificações úteis para um aplicativo CBT. Para obter mais informações, consulte o procedimento de gancho CBTProc . |
|
Instala um procedimento de gancho útil para depurar outros procedimentos de gancho. Para obter mais informações, consulte o procedimento de gancho DebugProc . |
|
Instala um procedimento de gancho que será chamado quando o thread em primeiro plano do aplicativo estiver prestes a ficar ocioso. Esse gancho é útil para executar tarefas de baixa prioridade durante o tempo ocioso. Para obter mais informações, consulte o procedimento de gancho ForegroundIdleProc . |
|
Instala um procedimento de gancho que monitora mensagens postadas em uma fila de mensagens. Para obter mais informações, consulte o procedimento de gancho GetMsgProc . |
|
Aviso Windows 11 e mais recentes: não há suporte para APIs de gancho de registro em diário. Em vez disso, recomendamos usar a API SendInput TextInput. Instala um procedimento de gancho que posta mensagens registradas anteriormente por um procedimento de gancho de WH_JOURNALRECORD . Para obter mais informações, consulte o procedimento de gancho JournalPlaybackProc . |
|
Aviso Windows 11 e mais recentes: não há suporte para APIs de gancho de registro em diário. Em vez disso, recomendamos usar a API SendInput TextInput. Instala um procedimento de gancho que registra mensagens de entrada postadas na fila de mensagens do sistema. Esse gancho é útil para gravar macros. Para obter mais informações, consulte o procedimento de gancho JournalRecordProc . |
|
Instala um procedimento de gancho que monitora mensagens de pressionamento de tecla. Para obter mais informações, consulte o procedimento de gancho KeyboardProc . |
|
Instala um procedimento de gancho que monitora eventos de entrada de teclado de baixo nível. Para obter mais informações, consulte o procedimento de gancho [LowLevelKeyboardProc](/windows/win32/winmsg/lowlevelkeyboardproc). |
|
Instala um procedimento de gancho que monitora mensagens do mouse. Para obter mais informações, consulte o procedimento de gancho MouseProc . |
|
Instala um procedimento de gancho que monitora eventos de entrada de mouse de baixo nível. Para obter mais informações, consulte o procedimento de gancho LowLevelMouseProc . |
|
Instala um procedimento de gancho que monitora mensagens geradas como resultado de um evento de entrada em uma caixa de diálogo, caixa de mensagem, menu ou barra de rolagem. Para obter mais informações, consulte o procedimento de gancho MessageProc . |
|
Instala um procedimento de gancho que recebe notificações úteis para aplicativos de shell. Para obter mais informações, consulte o procedimento de gancho ShellProc . |
|
Instala um procedimento de gancho que monitora mensagens geradas como resultado de um evento de entrada em uma caixa de diálogo, caixa de mensagem, menu ou barra de rolagem. O procedimento de gancho monitora essas mensagens para todos os aplicativos na mesma área de trabalho que o thread de chamada. Para obter mais informações, consulte o procedimento de gancho SysMsgProc . |
[in] lpfn
Tipo: HOOKPROC
Um ponteiro para o procedimento de gancho. Se o parâmetro dwThreadId for zero ou especificar o identificador de um thread criado por um processo diferente, o parâmetro lpfn deverá apontar para um procedimento de gancho em uma DLL. Caso contrário, lpfn pode apontar para um procedimento de gancho no código associado ao processo atual.
[in] hmod
Tipo: HINSTANCE
Um identificador para a DLL que contém o procedimento de gancho apontado pelo parâmetro lpfn . O parâmetro hMod deverá ser definido como NULL se o parâmetro dwThreadId especificar um thread criado pelo processo atual e se o procedimento de gancho estiver dentro do código associado ao processo atual.
[in] dwThreadId
Tipo: DWORD
O identificador do thread ao qual o procedimento de gancho deve ser associado. Para aplicativos da área de trabalho, se esse parâmetro for zero, o procedimento de gancho será associado a todos os threads existentes em execução na mesma área de trabalho que o thread de chamada. Para aplicativos da Windows Store, consulte a seção Comentários.
Retornar valor
Tipo: HHOOK
Se a função for bem-sucedida, o valor retornado será o identificador para o procedimento de gancho.
Se a função falhar, o valor retornado será NULL. Para obter informações de erro estendidas, chame GetLastError.
Comentários
SetWindowsHookEx pode ser usado para injetar uma DLL em outro processo. Uma DLL de 32 bits não pode ser injetada em um processo de 64 bits e uma DLL de 64 bits não pode ser injetada em um processo de 32 bits. Se um aplicativo exigir o uso de ganchos em outros processos, será necessário que um aplicativo de 32 bits chame SetWindowsHookEx para injetar uma DLL de 32 bits em processos de 32 bits e uma chamada de aplicativo de 64 bits SetWindowsHookEx para injetar uma DLL de 64 bits em processos de 64 bits. As DLLs de 32 bits e 64 bits devem ter nomes diferentes.
Como os ganchos são executados no contexto de um aplicativo, eles devem corresponder à "bitness" do aplicativo. Se um aplicativo de 32 bits instalar um gancho global no Windows de 64 bits, o gancho de 32 bits será injetado em cada processo de 32 bits (os limites de segurança usuais se aplicam). Em um processo de 64 bits, os threads ainda são marcados como "fisgados". No entanto, como um aplicativo de 32 bits deve executar o código de gancho, o sistema executa o gancho no contexto do aplicativo de conexão; especificamente, no thread chamado SetWindowsHookEx. Isso significa que o aplicativo de conexão deve continuar a bombear mensagens ou pode bloquear o funcionamento normal dos processos de 64 bits.
Se um aplicativo de 64 bits instala um gancho global no Windows de 64 bits, o gancho de 64 bits é injetado em cada processo de 64 bits, enquanto todos os processos de 32 bits usam um retorno de chamada para o aplicativo de conexão.
Para conectar todos os aplicativos na área de trabalho de uma instalação do Windows de 64 bits, instale um gancho global de 32 bits e um gancho global de 64 bits, cada um dos processos apropriados, e certifique-se de continuar bombeando mensagens no aplicativo de conexão para evitar bloquear o funcionamento normal. Se você já tiver um aplicativo de conexão global de 32 bits e ele não precisar ser executado no contexto de cada aplicativo, talvez não seja necessário criar uma versão de 64 bits.
Um erro poderá ocorrer se o parâmetro hMod for NULL e o parâmetro dwThreadId for zero ou especificar o identificador de um thread criado por outro processo.
Chamar a função CallNextHookEx para encadear para o próximo procedimento de gancho é opcional, mas é altamente recomendável; caso contrário, outros aplicativos que têm ganchos instalados não receberão notificações de gancho e poderão se comportar incorretamente como resultado. Você deve chamar CallNextHookEx , a menos que seja absolutamente necessário impedir que a notificação seja vista por outros aplicativos.
Antes de encerrar, um aplicativo deve chamar a função UnhookWindowsHookEx para liberar recursos do sistema associados ao gancho.
O escopo de um gancho depende do tipo de gancho. Alguns ganchos só podem ser definidos com escopo global; outros também podem ser definidos apenas para um thread específico, conforme mostrado na tabela a seguir.
Gancho | Escopo |
---|---|
WH_CALLWNDPROC | Thread ou global |
WH_CALLWNDPROCRET | Thread ou global |
WH_CBT | Thread ou global |
WH_DEBUG | Thread ou global |
WH_FOREGROUNDIDLE | Thread ou global |
WH_GETMESSAGE | Thread ou global |
WH_JOURNALPLAYBACK | Somente global |
WH_JOURNALRECORD | Somente global |
WH_KEYBOARD | Thread ou global |
WH_KEYBOARD_LL | Somente global |
WH_MOUSE | Thread ou global |
WH_MOUSE_LL | Somente global |
WH_MSGFILTER | Thread ou global |
WH_SHELL | Thread ou global |
WH_SYSMSGFILTER | Somente global |
Para um tipo de gancho especificado, os ganchos de thread são chamados primeiro e, em seguida, ganchos globais. Lembre-se de que os ganchos WH_MOUSE, WH_KEYBOARD, WH_JOURNAL*, WH_SHELL e de baixo nível podem ser chamados no thread que instalou o gancho em vez do thread processando o gancho. Para esses ganchos, é possível que os ganchos de 32 e 64 bits sejam chamados se um gancho de 32 bits estiver à frente de um gancho de 64 bits na cadeia de ganchos.
Os ganchos globais são um recurso compartilhado e a instalação de um afeta todos os aplicativos na mesma área de trabalho que o thread de chamada. Todas as funções de gancho global devem estar em bibliotecas. Os ganchos globais devem ser restritos a aplicativos de uso especial ou usar como um auxílio de desenvolvimento durante a depuração do aplicativo. Bibliotecas que não precisam mais de um gancho devem remover seu procedimento de gancho.
Desenvolvimento de aplicativos da Windows Store Se dwThreadId for zero, as DLLs do gancho de janela não serão carregadas em processo para os processos de aplicativo da Windows Store e o processo do agente de Windows Runtime, a menos que sejam instaladas por processos UIAccess (ferramentas de acessibilidade). A notificação é entregue no thread do instalador para esses ganchos:
- WH_JOURNALPLAYBACK
- WH_JOURNALRECORD
- WH_KEYBOARD
- WH_KEYBOARD_LL
- WH_MOUSE
- WH_MOUSE_LL
Exemplos
Para obter um exemplo, consulte Instalando e liberando procedimentos de gancho.
Observação
O cabeçalho winuser.h define SetWindowsHookEx 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-window-l1-1-0 (introduzido em Windows 8) |
Confira também
Conceitual