Здравствуйте уважаемые коллеги!
В данном примере показано как можно зарегистрировать горячие клавиши для вашего приложения в системе, которые будут срабатывать даже если окно вашей программы не активно или скрыто.
Итак, для регистрации клавиш нам понадобится API функция RegisterHotKey.
Вот её описание:
function RegisterHotKey(hWnd: HWND; id: Integer; fsModifiers, vk: UINT): BOOL;
hWnd — Handle окна, которому будет посылаться сообщение при нажатии горячей клавиши.
id — Код, который вы назначает горячей клавише и по которому будете идентифицировать нажатие. Нельзя добавить несколько клавиш с одинаковым id.
fsModifiers — Модификаторы, которые указывают на необходимость нажатия системных клавиш вместе с указанной клавишей, такие как Alt, Ctrl, Win и т.д.
vk — Код клавиши, при нажатии на которую будет отсылаться сообщение. Список кодов клавиш можно посмотреть по данной ссылке: Virtual-Key Codes
При завершении нашего приложения мы должны удалить зарегистрированную горячую клавишу процедурой UnregisterHotKey.
function UnregisterHotKey(hWnd: HWND; id: Integer): BOOL;
hWnd — Handle окна.
id — Код горячей клавиши, который мы указывали при регистрации.
Теперь создадим само приложение, которое будет реагировать на нажатие сочетания клавиш Ctrl+G и записывать Handle и заголовок текущего активного окна.
Визуальная часть программы будет состоять из формы TForm и текстового редактора TMemo:
Добавим константу, которая будет определять регистрационный код горячей клавиши:
const KEY_ID = 123456;
В обработчике события OnCreate формы добавляем код, который зарегистрирует горячую клавишу:
procedure TfmMain.FormCreate(Sender: TObject); begin RegisterHotKey(Self.Handle, KEY_ID, MOD_CONTROL, $47); end;
47 — Код клавиши «G»
В обработчике события OnDestroy удалим регистрацию:
procedure TfmMain.FormDestroy(Sender: TObject); begin UnRegisterHotKey(Handle, KEY_ID); end;
При нажатии на горячую клавишу нашему приложению будет посылаться сообщение WM_HOTKEY, которое нам нужно обработать. Для этого в разделе private формы добавим процедуру обработчик события WM_HOTKEY:
TfmMain = class(TForm) m: TMemo; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY; public end;
И в разделе implementation добавим код процедуры для получения Handle и заголовка активного окна:
procedure TfmMain.WMHotKey(var Msg: TWMHotKey); var h: THandle; txt: string; begin if Msg.HotKey = KEY_ID then begin h := GetForegroundWindow; SetLength(txt, 255); GetWindowText(h, PChar(txt), 255); m.Lines.Add(IntToStr(h) + ' - ' + txt); end; end;
Исходный код можно скачать по этой ссылке.