Регистрируем горячие клавиши для своего приложения в системе

Здравствуйте уважаемые коллеги!

В данном примере показано как можно зарегистрировать горячие клавиши для вашего приложения в системе, которые будут срабатывать даже если окно вашей программы не активно или скрыто.

Итак, для регистрации клавиш нам понадобится 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:
1

Добавим константу, которая будет определять регистрационный код горячей клавиши:

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;

Результат работы программы:
2

Исходный код можно скачать по этой ссылке.

Статья добавлена в Delphi. Добавить ссылку в закладки.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *