não capaz de instalar ganchos para todos os threads em um processo
-
21-09-2019 - |
Pergunta
Estou conectando teclado no aplicativo. O requisito é conectar o teclado em todos os threads no processo.
Eu usei SetWindowshookex API
SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)::KeyboardHookProc, hInst, 0);
O gancho é criado para todos os threads em processo. Isso funciona bem até que o thread de chamadas exista. Assim que o thread de chamadas termina, pare de funcionar.
Existe alguma maneira de conectar o processo em vez de threads em processo.
Solução
Esta impressão fina nos documentos SDK para LowLevelKeyboardProc é crucial:
Este gancho é chamado no contexto do encadeamento que o instalou. A chamada é feita enviando uma mensagem para o thread que instalou o gancho. Portanto, o encadeamento que instalou o gancho deve ter um loop de mensagem.
Em outras palavras, você deve manter o thread vivo e o thread deve bombear um loop de mensagem. O comportamento que você vê agora é inteiramente por design.
Outras dicas
Conforme MSDN, Wh__Keyboard___ll é aplicado globalmente, não é específico do aplicativo.
Se você deseja instalar o gancho para um processo, use threads específicos Wh___keyboard.
Basta instalar o gancho na função principal. Se você precisar apenas quando um thread específico é executado, você pode usar um sinalizador volátil.