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

Delphi

Как выполнить действие при нажатии на горячую кнопку, даже если ваша программа не в фокусе

Где-то в начале нужно зарегистрировать хоткей:

var
  FHotKeyId : Word;
...
  // Создаём атом.
  FHotKeyId := GlobalAddAtom(PWideChar('Unique string'));
  // Регистрируем хоткей.
  if not(RegisterHotKey(FHandle, FHotKeyId, modif, key)) then
    MessageDlg('Хоткей не зарегистрирован.', mtWarning, [mbOk], 0);

FHandle - указатель окна, которому будет передаваться событие нажатия хоткея. Проще всего использовать Form.Handle той формы, где будет обработчик события.
'Unique string' - уникальный идентификатор, по которому создаётся атом.
key - код кнопки. Именно клавиши, а не символа.
modif - набор модификаторов MOD_CONTROL, MOD_ALT, MOD_SHIFT, MOD_WIN. Это битовые маски, объединаются при помощи OR.

По завершении нужно прибраться за собой:

  // Отменяем регистрацию
  UnRegisterHotKey(FHandle, FHotKeyId);
  // Освобождаем атом
  GlobalDeleteAtom(FHotKeyId);

Теперь при нажатии горячей клавиши форма будет получать события WM_HOTKEY. Осталось только написать для неё обработчик:

TMyForm = class(TForm)
  ...
  procedure WMHotKey(var hotkey: TWMHotKey); message WM_HOTKEY;
end;
...
procedure TMyForm .WMHotKey(var hotkey: TWMHotKey);
begin
  // Если зарегистрировано несколько клавиш, их можно различать.
  if hotkey.HotKey = 71 // Если нажата G
    then MessageBeep(MB_OK)
    else MessageBeep(MB_ICONERROR)
end;
Метки:

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Допустимые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и абзацы переносятся автоматически.
  • Вы можете цитировать другие сообщения, используя тэг [quote]

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и абзацы переносятся автоматически.