it-swarm.dev

Como posso determinar qual processo possui uma tecla de atalho no Windows?

Dada uma tecla de atalho, como posso encontrar qual o programa que possui?

92
aldrinleal

Atenção : Se você usar o Win 8 ou posterior, não use este utilitário, pois isso criará alguns problemas - veja os comentários.

Se você estiver executando um Windows anterior ao Windows 8, então Windows Hotkey Explorer é provavelmente o que você deseja. Isso também é mencionado na pergunta do StackOverflow: Descubra qual processo registrou uma tecla de atalho global? (API do Windows) .

45
Hans-Peter Störr

Isso funciona para mim no Win10 (e provavelmente em todas as versões do Windows, até mesmo vagamente recentes) ... também copiado aqui de https://stackoverflow.com/a/43645062/995048 já que esta página parece para aparecer primeiro nos resultados da pesquisa:

Uma maneira possível é usar a ferramenta do Visual Studio Spy ++ .

Experimente:

  1. Execute a ferramenta (para mim, é C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\spyxx_AMD64.exe ou use spyxx.exe para monitorar processos de 32 bits)
  2. Na barra de menu, selecione Spy -> Mensagens de log ... (ou pressione Ctrl + M)
  3. Verificar Todas as Janelas no Sistema no Quadro Adicional do Windows
  4. Mude para o separador Mensagens
  5. Clique no botão Limpar tudo
  6. Selecione WM_HOTKEY na caixa de listagem ou marque Teclado em Grupos de Mensagens (se estiver OK com mais ruído em potencial)
  7. Clique no botão OK
  8. Pressione a tecla de atalho em questão (Win + R, por exemplo)
  9. Selecione a linha WM_HOTKEY na janela Messages (All Windows) , clique com o botão direito e selecione Properties ... no menu de contexto
  10. No diálogo Propriedades da Mensagem , clique no link do Identificador da Janela (esse será o identificador da janela que recebeu a mensagem)
  11. Clique no botão Sincronizar na caixa de diálogo Propriedades da Janela . Isso mostrará a janela no treeview principal da janela do Spy ++.
  12. Na caixa de diálogo Propriedades da Janela , selecione a guia Processo
  13. Clique no link ID do processo . Isto irá mostrar-lhe o processo (na minha Win + R case: Explorer)
50
user995048

Isso provavelmente foi respondido no Stack Overflow neste thread:

Descubra qual processo registrou uma tecla de atalho global? (API do Windows)

Aqui está a resposta Pauk :

Sua pergunta despertou meu interesse, então eu fiz um pouco de escavação e, infelizmente, eu não tenho uma resposta adequada para você, pensei em compartilhar o que tenho.

Eu encontrei isso exemplo de criação de gancho de teclado (em Delphi) escrito em 1998, mas é compilável em Delphi 2007 com alguns ajustes.

É uma DLL com uma chamada para SetWindowsHookEx que passa por uma função de retorno de chamada, que pode então interceptar traços de tecla: neste caso, é mexer com eles por diversão, mudar o cursor para a direita, etc. em seguida, chama o DLL e relata seus resultados com base em um evento TTimer. Se você estiver interessado, posso postar o código baseado no Delphi 2007.

É bem documentado e comentado e você potencialmente poderia usá-lo como uma base para descobrir onde uma impressora de teclas está indo. Se você pudesse obter o controle do aplicativo que enviava os toques de tecla, poderia rastreá-lo dessa maneira. Com esse identificador, você conseguiria obter as informações necessárias com bastante facilidade.

Outros aplicativos tentaram determinar as teclas de atalho, passando por seus atalhos, pois eles podem conter uma tecla de atalho, que é apenas outro termo para hotkey. No entanto, a maioria dos aplicativos não costuma definir essa propriedade, portanto, pode não retornar muito. Se você estiver interessado nessa rota, o Delphi tem acesso à interface COM IShellLink que você pode usar para carregar um atalho e obter sua hotkey:

uses ShlObj, ComObj, ShellAPI, ActiveX, CommCtrl;

procedure GetShellLinkHotKey;
var
  LinkFile : WideString;
  SL: IShellLink;
  PF: IPersistFile;

  HotKey : Word;
  HotKeyMod: Byte;
  HotKeyText : string;
begin
  LinkFile := 'C:\Temp\Temp.lnk';

  OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, SL));

  // The IShellLink implementer must also support the IPersistFile
  // interface. Get an interface pointer to it.
  PF := SL as IPersistFile;

  // Load file into IPersistFile object
  OleCheck(PF.Load(PWideChar(LinkFile), STGM_READ));

  // Resolve the link by calling the Resolve interface function.
  OleCheck(SL.Resolve(0, SLR_ANY_MATCH or SLR_NO_UI));

  // Get hotkey info
  OleCheck(SL.GetHotKey(HotKey));

  // Extract the HotKey and Modifier properties.
  HotKeyText := '';
  HotKeyMod := Hi(HotKey);

  if (HotKeyMod and HOTKEYF_ALT) = HOTKEYF_ALT then
    HotKeyText := 'ALT+';
  if (HotKeyMod and HOTKEYF_CONTROL) = HOTKEYF_CONTROL then
    HotKeyText := HotKeyText + 'CTRL+';
  if (HotKeyMod and HOTKEYF_SHIFT) = HOTKEYF_SHIFT then
    HotKeyText := HotKeyText + 'SHIFT+';
  if (HotKeyMod and HOTKEYF_EXT) = HOTKEYF_EXT then
    HotKeyText := HotKeyText + 'Extended+';

  HotKeyText := HotKeyText + Char(Lo(HotKey));

  if (HotKeyText = '') or (HotKeyText = #0) then
    HotKeyText := 'None';

  ShowMessage('Shortcut Key - ' + HotKeyText);
end;

Se você tem acesso a Safari Books Online , há um boa seção sobre como trabalhar com atalhos/links da Shell no Borland Delphi 6 Developer's Guide por Steve Teixeira e Xavier Pacheco . Meu exemplo acima é uma versão abatida de lá e este site .

Espero que ajude!

5
Ivo Flipse