macOS App: manipulação de combinações de teclas associadas a atalhos de teclado globais

Em alguns aplicativos, faz sentido para o aplicativo manipular diretamente atalhos de teclado que, de outra forma, estão vinculados a combinações em todo o sistema. Por exemplo, Space-Space (normalmente Spotlight) ou ⌘-Tab (normalmente alternador de aplicativos). Isso funciona em vários aplicativos Mac, como VMWare Fusion, clientes de compartilhamento de tela e área de trabalho remota da Apple (encaminhando os eventos para a VM ou servidor, respectivamente, em vez de manipulá-los localmente), e também alguns aplicativos de terceiros semelhantes no aplicativo Loja.

Gostaríamos de implementar esse modo no aplicativo em que estamos trabalhando, mas estamos tendo dificuldades para descobrir como fazê-lo. Devo salientar que o aplicativo em questão é um aplicativo em primeiro plano comum, está em área restrita e qualquer solução deve estar em conformidade com as regras da App Store. O fato de outros aplicativos da loja poderem fazer isso implica que isso deve ser possível.

Para ser claro, queremos:

Detecte e lide com todas as teclas pressionadas, incluindo aquelas associadas a atalhos globais.Impedir que os atalhos globais acionem seu efeito vinculado globalmente.

Da AppleDocumento de Arquitetura de Eventos sugere que o aplicativo em primeiro plano já esteja recebendo esses eventos. (Ele fala apenas de níveis anteriores que lidam com coisas como os botões de energia e de ejeção, o que é bom.) Ele continua sugerindo, e odocumento de eventos importantes também implica esteNSApplicationésendEvent: O método é o que detecta possíveis atalhos com base em sinalizadores de modificador, enviando-os para as janelas e, se isso falhar, para a barra de menus. Não está explicitamente declarado o que acontece com os atalhos vinculados globalmente.

Eu tentei subclassificarNSApplication e substituindosendEvent:. Não importa se passo todos os eventos para a implementação da superclasse ou, se digo, filtrar eventos da tecla modificadora, quando pressiono ⌘-Space, recebo os eventos por pressionar e liberar a tecla command (⌘), mas não a barra de espaço. A interface do usuário do Spotlight sempre aparece.

Não encontrei muita informação sobre a subclasse de aplicativos NSA e seu tratamento de eventos anteriores, da Apple ou de outro tipo. Não consigo descobrir em que nível os atalhos globais são detectados e manipulados.

Alguém pode, por favor, apontar a direção certa?

Possíveis soluções que não funcionam:

Sugestões que eu já vi em outras postagens do Stack Overflow, mas que não se aplicam aos outros aplicativos que vi, e que violam as regras da App Store:

APIs de acessibilidade (precisa de permissão especial)Torneiras / ganchos de eventos (precisa ser executado como root)

De qualquer forma, esses dois seriam um exagero, pois permitem interceptartudo eventos emtudo vezes, não apenas enquanto o aplicativo é o aplicativo em primeiro plano.

NSeventéaddGlobalMonitorForEventsMatchingMask:handler: enquanto isso não impede que o manipulador de atalhos global seja acionado para esses eventos, então nem me importei em tentar.

questionAnswers(1)

yourAnswerToTheQuestion