Ваш вопрос вызвал у меня интерес, поэтому я немного покопался, и, к сожалению, у меня нет правильного ответа для вас, я решил поделиться тем, что у меня есть.
Я нашел этот пример создания клавиатуры (в 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 от Steve Teixeira и Xavier Пачеко. Мой пример выше - отрубленная версия оттуда и этот сайт .
Надеюсь, это поможет!