Ваше запитання викликало мій інтерес, тому я трохи копав, і, на жаль, не маю належної відповіді для вас, я думав, що поділюсь тим, що маю.
Я знайшов цей приклад створення гачка для клавіатури (у 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 ++ .