Sua pergunta despertou meu interesse, então fiz algumas pesquisas e, embora, infelizmente, não tenha uma resposta adequada para você, pensei em compartilhar o que tenho.
Encontrei este 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 os pressionamentos de tecla: Neste caso, está mexendo nelas para se divertir, mudando o cursor da esquerda para a direita etc. Um aplicativo simples chama a DLL e informa de volta seus resultados com base em um evento TTimer. Se você estiver interessado, posso postar o código baseado em Delphi 2007.
Está bem documentado e comentado e você pode usá-lo como base para descobrir para onde um pressionamento de tecla está indo. Se você pudesse obter o identificador do aplicativo que enviou os pressionamentos de tecla, poderia rastreá-lo dessa forma. Com esse identificador, você poderá obter as informações de que precisa com bastante facilidade.
Outros aplicativos tentaram determinar as teclas de atalho percorrendo seus atalhos, pois podem conter uma tecla de atalho, que é apenas outro termo para tecla de atalho. No entanto, a maioria dos aplicativos não tende a definir essa propriedade, portanto, ela pode não retornar muito. Se você estiver interessado nessa rota, a Delphi tem acesso aIShellLink
interface COM que você pode usar para carregar um atalho e obter sua tecla de atalho:
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ê tiver acesso ao Safari Books Online , há uma boa seção sobre como trabalhar com atalhos / links de shell no Borland Delphi 6 Developer's Guide de Steve Teixeira e Xavier Pacheco. Meu exemplo acima é uma versão massacrada de lá e deste site .
Espero que ajude!
WM_HOTKEY
mensagem no registro de mensagens após pressionar a tecla de atalho, pode ser necessário executar a versão de 32 bits do Spy ++ .