Como o Windows escuta as teclas de atalho do sistema?
772
Para um projeto em que estou trabalhando. Eu queria saber, como o Windows 10 escuta as teclas de atalho do sistema? Existe algum serviço do sistema em segundo plano fazendo isso?
Por teclas de atalho do sistema, quero dizer Alt+ F4e similares.
Quando uma tecla é pressionada, o kernel do Windows recebe a mensagem do driver do teclado e a adiciona a uma fila de mensagens do sistema. Essas mensagens são enviadas para todos os programas em execução na máquina, incluindo os que controlam o pressionamento de teclas de atalho.
A documentação sobre quais programas lidam com quais combinações de teclas é escassa, mas é seguro apostar que os aplicativos do Windows Explorer, "Windows Session Manager" ou "Shell Infrastructure Host" que você pode ver em seu gerenciador de tarefas são responsáveis por lidar com essas combinações de teclas.
Por exemplo, a combinação Win+ Rpara abrir "Executar" é gerenciada pelo Windows Explorer. Se você fechar o Windows Explorer no gerenciador de tarefas e tentar usar essa combinação, não funcionará. Mais combinações de baixo nível, como Alt+ F4, provavelmente seriam manipuladas pelo gerenciador de sessão ou pelo host da infraestrutura do shell.
Portanto, não existe um programa único que lide com todas as combinações de teclas. É uma mistura de vários aplicativos do Windows pré-instalados. O Windows Explorer, por exemplo, é responsável pela maior parte da GUI do seu PC e lida com um bom número dessas combinações de teclas.
Edit: Desktop Window Manager parece ser aquele que lida com combinações de teclas como Alt+ F4.
Essas chaves são tratadas na dll principal da interface do usuário do Windows, user32.dll.
Esta é a ajuda de um editor que explica como um editor de texto específico é programado.
Estrutura de um programa do Windows
O Windows fornece um grande número de controles implementados como janelas. Este programa usa a janela RichEdit imitando uma janela Edit (aquele bloco de notas usa). Isso nos dá capacidade de edição semelhante ao Word, mantendo-o como texto.
Sub principal
Um programa inicia e registra as janelas que irá utilizar (RegisterWindowsEx). Em seguida, ele cria as janelas e quaisquer janelas filhas, incluindo controles embutidos (CreateWindowEx).
Cria menus e teclas aceleradoras.
Ele define opções para a janela principal e mais de 100 opções para a janela do RichEdit. Ele também instrui a janela do RichEdit a notificar a janela principal sobre certas mensagens que a janela do RichEdit recebe.
Em seguida, mostra as janelas e as atualiza. Seu programa agora está sendo executado como um programa gráfico.
Entra em um loop e envia todas as mensagens recebidas para DispatchMessage, que as envia para o procedimento da janela principal ou para o procedimento da janela RichEdit. Quando a janela fecha, seu loop sai e o programa termina.
Janela Procedimento
Este é o coração de um programa do Windows. Este programa tem dois, a janela principal e a janela do RichEdit.
O programador deve escrever o procedimento da janela principal. Embora um que apenas conecte o encanamento padrão tenha apenas três linhas de código.
Todas as janelas têm um procedimento padrão do Windows. Isso lida com bordas, menus, barras de título, cursor, ponteiro, etc. No caso do RichEdit, o procedimento de janela oferece a maioria dos recursos do MS Word.
Existem mensagens gerais do Windows (como redimensionamento da janela wm_size) do gerenciador de janelas para qualquer janela, dependendo da mensagem. Editar notificações de controle (RichEdit também envia as mesmas mensagens de notificação como um controle de edição) e notificações de RichEdit são enviadas pela janela Richedit para a janela principal.
Nós apenas lidamos com as mensagens que precisamos. Deixamos que as janelas desenhem as bordas das janelas e, assim, passamos mensagens para que o façamos em nosso procedimento padrão de janelas. Processamos mensagens como se um item de menu tivesse sido escolhido quando recebemos uma mensagem WM_Command.
O gerenciador de janelas envia mensagens do mouse para a janela principal se o ponteiro estiver sobre uma borda, menu ou barra de título. Se estiver sobre o RichEdit, a janela do RichEdit receberá essas mensagens, embora você possa pedir ao RichEdit para encaminhá-las para você, como este programa faz para o texto alterado e o menu de contexto.
A maioria das teclas vai para o controle RichEdit. Possui uma extensa interface de edição de teclado. As teclas do sistema (como Alt + F4) e as teclas de menu (Alt + F) são enviadas para a janela principal que normalmente não as processa, mas as passa para o procedimento padrão da janela. A janela principal aguarda o procedimento padrão para enviá-lo de volta como um comando para executar (como WM_Close para sair ou WM_Command para um item de menu que foi escolhido).
A menos que registremos outras chaves, elas irão para a janela RichEdit. EX.: Ctrl + A seleciona todo o texto e faz parte da interface de teclado do RichEdit (em seguida, envia para a janela principal uma mensagem de alteração de seleção). No entanto, Ctrl + S não faz parte da interface de teclado do RichEdit e o RichEdit o ignora. Portanto, precisamos registrar Ctrl + S, para que a janela principal o receba em vez do RichEdit, mas não Ctrl + A.
Em uma função que é um Select Case, o procedimento da janela principal verifica se processará a mensagem. Caso contrário, chamará o procedimento de janela padrão que processará a mensagem, se necessário.
Então
Para sair do programa, feche a janela enviando uma mensagem WM_Close. Isso se transformará em uma mensagem WM_Destroy que você receberá e chamará PostQuitMessage. Seu procedimento de janela acabou.
O loop principal recebe uma mensagem WM_Quit e sai do loop.
As duas últimas linhas destroem a tabela do acelerador e o menu de contexto (já que não está atribuído a uma janela). Outros menus que foram atribuídos à janela são destruídos automaticamente. O programa acabou.
Quando uma tecla é pressionada, o kernel do Windows recebe a mensagem do driver do teclado e a adiciona a uma fila de mensagens do sistema. Essas mensagens são enviadas para todos os programas em execução na máquina, incluindo os que controlam o pressionamento de teclas de atalho.
A documentação sobre quais programas lidam com quais combinações de teclas é escassa, mas é seguro apostar que os aplicativos do Windows Explorer, "Windows Session Manager" ou "Shell Infrastructure Host" que você pode ver em seu gerenciador de tarefas são responsáveis por lidar com essas combinações de teclas.
Por exemplo, a combinação Win+ Rpara abrir "Executar" é gerenciada pelo Windows Explorer. Se você fechar o Windows Explorer no gerenciador de tarefas e tentar usar essa combinação, não funcionará. Mais combinações de baixo nível, como Alt+ F4, provavelmente seriam manipuladas pelo gerenciador de sessão ou pelo host da infraestrutura do shell.
Portanto, não existe um programa único que lide com todas as combinações de teclas. É uma mistura de vários aplicativos do Windows pré-instalados. O Windows Explorer, por exemplo, é responsável pela maior parte da GUI do seu PC e lida com um bom número dessas combinações de teclas.
Edit: Desktop Window Manager parece ser aquele que lida com combinações de teclas como Alt+ F4.
Consulte https://docs.microsoft.com/en-us/windows/win32/menurc/wm-syscommand e também wm_command.
Essas chaves são tratadas na dll principal da interface do usuário do Windows, user32.dll.
Esta é a ajuda de um editor que explica como um editor de texto específico é programado.
Estrutura de um programa do Windows
O Windows fornece um grande número de controles implementados como janelas. Este programa usa a janela RichEdit imitando uma janela Edit (aquele bloco de notas usa). Isso nos dá capacidade de edição semelhante ao Word, mantendo-o como texto.
Sub principal
Um programa inicia e registra as janelas que irá utilizar (RegisterWindowsEx). Em seguida, ele cria as janelas e quaisquer janelas filhas, incluindo controles embutidos (CreateWindowEx).
Cria menus e teclas aceleradoras.
Ele define opções para a janela principal e mais de 100 opções para a janela do RichEdit. Ele também instrui a janela do RichEdit a notificar a janela principal sobre certas mensagens que a janela do RichEdit recebe.
Em seguida, mostra as janelas e as atualiza. Seu programa agora está sendo executado como um programa gráfico.
Entra em um loop e envia todas as mensagens recebidas para DispatchMessage, que as envia para o procedimento da janela principal ou para o procedimento da janela RichEdit. Quando a janela fecha, seu loop sai e o programa termina.
Janela Procedimento
Este é o coração de um programa do Windows. Este programa tem dois, a janela principal e a janela do RichEdit.
O programador deve escrever o procedimento da janela principal. Embora um que apenas conecte o encanamento padrão tenha apenas três linhas de código.
Todas as janelas têm um procedimento padrão do Windows. Isso lida com bordas, menus, barras de título, cursor, ponteiro, etc. No caso do RichEdit, o procedimento de janela oferece a maioria dos recursos do MS Word.
Existem mensagens gerais do Windows (como redimensionamento da janela wm_size) do gerenciador de janelas para qualquer janela, dependendo da mensagem. Editar notificações de controle (RichEdit também envia as mesmas mensagens de notificação como um controle de edição) e notificações de RichEdit são enviadas pela janela Richedit para a janela principal.
Nós apenas lidamos com as mensagens que precisamos. Deixamos que as janelas desenhem as bordas das janelas e, assim, passamos mensagens para que o façamos em nosso procedimento padrão de janelas. Processamos mensagens como se um item de menu tivesse sido escolhido quando recebemos uma mensagem WM_Command.
O gerenciador de janelas envia mensagens do mouse para a janela principal se o ponteiro estiver sobre uma borda, menu ou barra de título. Se estiver sobre o RichEdit, a janela do RichEdit receberá essas mensagens, embora você possa pedir ao RichEdit para encaminhá-las para você, como este programa faz para o texto alterado e o menu de contexto.
A maioria das teclas vai para o controle RichEdit. Possui uma extensa interface de edição de teclado. As teclas do sistema (como Alt + F4) e as teclas de menu (Alt + F) são enviadas para a janela principal que normalmente não as processa, mas as passa para o procedimento padrão da janela. A janela principal aguarda o procedimento padrão para enviá-lo de volta como um comando para executar (como WM_Close para sair ou WM_Command para um item de menu que foi escolhido).
A menos que registremos outras chaves, elas irão para a janela RichEdit. EX.: Ctrl + A seleciona todo o texto e faz parte da interface de teclado do RichEdit (em seguida, envia para a janela principal uma mensagem de alteração de seleção). No entanto, Ctrl + S não faz parte da interface de teclado do RichEdit e o RichEdit o ignora. Portanto, precisamos registrar Ctrl + S, para que a janela principal o receba em vez do RichEdit, mas não Ctrl + A.
Em uma função que é um Select Case, o procedimento da janela principal verifica se processará a mensagem. Caso contrário, chamará o procedimento de janela padrão que processará a mensagem, se necessário.
Então
Para sair do programa, feche a janela enviando uma mensagem WM_Close. Isso se transformará em uma mensagem WM_Destroy que você receberá e chamará PostQuitMessage. Seu procedimento de janela acabou.
O loop principal recebe uma mensagem WM_Quit e sai do loop.
As duas últimas linhas destroem a tabela do acelerador e o menu de contexto (já que não está atribuído a uma janela). Outros menus que foram atribuídos à janela são destruídos automaticamente. O programa acabou.