Ваш вопрос вызвал у меня интерес, поэтому я немного покопался и, хотя, к сожалению, у меня нет для вас правильного ответа, я подумал, что поделюсь тем, что у меня есть.
Я нашел этот пример создания хука клавиатуры (в Delphi) написанный в 1998 году, но его можно скомпилировать в Delphi 2007 с парой настроек.
Это DLL с вызовом SetWindowsHookEx
который проходит через функцию обратного вызова, которая затем может перехватывать нажатия клавиш: в этом случае она возится с ними для удовольствия, меняет левый курсор на правый и т. Д. Затем простое приложение вызывает DLL и сообщает об этом. его результаты основаны на событии TTimer. Если вам интересно, я могу опубликовать код на основе Delphi 2007.
Он хорошо задокументирован и прокомментирован, и вы потенциально можете использовать его как основу для определения того, где происходит нажатие клавиши. Если бы вы могли получить дескриптор приложения, отправляющего нажатия клавиш, вы могли бы отследить его таким образом. С этим дескриптором вы сможете довольно легко получить необходимую информацию.
Другие приложения пытались определять горячие клавиши, просматривая свои ярлыки, поскольку они могут содержать горячую клавишу, что является просто еще одним термином для горячей клавиши. Однако большинство приложений не склонны устанавливать это свойство, поэтому оно может не возвращать много. Если вас интересует этот маршрут, Delphi имеет доступ к IShellLink
COM-интерфейсу, который вы можете использовать для загрузки ярлыка и получения его горячей клавиши:
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;
Если у вас есть доступ к Safari Books Online , есть хороший раздел о работе с ярлыками / ссылками на оболочку в Руководстве разработчика Borland Delphi 6 Стива Тейшейры и Ксавьера Пачеко. Мой пример выше - это забитая версия оттуда и с этого сайта .
Надеюсь, это поможет!
WM_HOTKEY
сообщение в журнале сообщений после нажатия горячей клавиши, вам может потребоваться запустить 32-битную версию Spy ++. .