Вторник, 28.01.2025, 23:43
AMAR Inc.
Приветствую Вас Гость | RSS
Главная Программирование Регистрация Вход
Меню сайта

Категории каталога
Разные статьи [48]
Система [62]

Главная » Статьи » Delphi » Разные статьи

HotKeys - горячии клавиши
  HotKeys - комбинации клавиш, на которые может реагировать приложение, даже если оно не имеет фокуса или запущено в трее.

   Hotkey состоит из клавиши-модификатора (Win, Alt, Control, Shift), и нажатия на любую другую клавишу, которая имеет виртуальный код.

   Для того чтобы научить программу обрабатывать горячие клавиши, углубимся в загадочные джунгли API, но прежде этого создадим обработчик события WM_HOTKEY. Для этого объявим в классе TForm1 следующий метод:
private
procedure WM_HotKeyHandler (var Message: TMessage);
message WM_HOTKEY;

   И определим его вот таким образом:
procedure TForm1.WM_HotKeyHandler (var Message: TMessage);
var
  idHotKey: integer; //идентификатор, но об этом - позже
  fuModifiers: word; //модификатор MOD_XX
  uVirtKey: word; //код виртуальной клавиши VK_XX
begin
  // параметры сообщения получаем так:
  idHotkey:= Message.wParam;
  fuModifiers:= LOWORD(Message.lParam);
  uVirtKey:= HIWORD(Message.lParam);
  //теперь - небольшая проверочка:
  if (fuModifiers = MOD_ALT) AND (uVirtKey = VK_F10) then
    caption:='Alt-F10 нажата';
  inherited;
end;

   В этом примере обработчик сообщения WM_HOTKEY проверяет, являются ли полученные параметры сигналом о нажатии комбинации Alt-F10, и в случае положительного ответа в заголовок окна главной формы выводится соответствующая строка.

   Теперь обратимся непосредственно к созданию горячей клавиши - в нашем примере это будет все та же Alt-F10. Вначале ее нужно зарегистрировать в системе. Как это делается? При помощи функции:

   BOOL RegisterHotKey(HWND hWnd, int id, UINT fsModifiers, UINT vk);
hWnd - окно, обрабатывающее сообщение WM_HOTKEY,
fsModifiers - модификаторы (MOD_ALT, MOD_CONTROL, MOD_SHIFT, MOD_WIN),
vk - виртуальный код клавиши (см. константы с префиксом VK_).

   Параметр id заслуживает отдельного разговора.

   Для приложения значение id может лежать в диапазоне 0000h..BFFFh, а для разделяемых динамических библиотек диапазон будет таким: C000h..FFFFh.

   Однако во избежание конфликтов между горячими клавишами различных процессов целесообразно использовать значение, возвращаемое функцией GlobalAddAtom, передавая ей в качестве параметра некую null-terminated строку длиной до 255 символов.

   Вот как это делается: Объявим глобальную переменную keyid: integer;

   Она станет атомом, который создастся вышеописанной функцией, и будет служить идентификатором горячей клавиши.    Для удобства поместим на форму две кнопки - первая будет создавать HotKey, вторая - уничтожать.

   Итак, создаем и регистрируем горячую клавишу:
procedure TForm1.Button1Click(Sender: TObject);
begin
  keyid:=GlobalAddAtom('My Hotkey'); //создаем атом
  RegisterHotKey(handle,// сообщение о HotKey будет получать форма
  keyid, // регистрируем атом как id
  MOD_ALT,// модификатор у нас - клавиша Alt
  VK_F10 // вирт. клавиша - F10
  );
end;

   А следующий код отменяет зарегистрированную клавишу, и удаляет атом:
procedure TForm1.Button3Click(Sender: TObject);
begin
  UnregisterHotKey(handle, keyid);
  GlobalDeleteAtom(keyid);
end;

   Рассмотрим еще один важный аспект работы с клавиатурой - способ отслеживания состояние клавиш Num Lock, Caps Lock, Scroll Lock и Insert.

   Понятное дело, что стандартными средствами Delphi тут не обойтись.
   Будем снова раскапывать API. Во-первых, зададим переменную Key типа word.

   Этой переменной можем присвоить значение одной из констант:
VK_NUMLOCK
VK_CAPITAL
VK_SCROLL
VK_INSERT

   Теперь:
Var state: TKeyboardState;
begin
  GetKeyboardState(state); //получить состояние клавиши
  if Odd(state[VK_NUMLOCK]) then ; //клавиша "включена"
  //как управлять состоянием клавиши?
  state[key] := state[key] XOR 1; //циклично переключить
  state[key] := state[key] OR 1; //включить
  state[key] := state[key] AND (NOT 1); //выключить
  SetKeyboardState(state); //установим новое значение
end;

   Программное переключение раскладки клавиатуры - если Microsoft Word это умеет, то почему не попробовать и нам?
ActivateKeyboardLayout(0,HKL_NEXT) - циклично переключает раскладку.

   Загрузить русскую можно с помощью кода:
LoadKeyboardLayout('00000419', KLF_ACTIVATE),
   а английскую
LoadKeyboardLayout('00000409',KLF_ACTIVATE).

   Вот, пожалуй, и все премудрости работы с клавиатурой.


Категория: Разные статьи | Добавил: amar-runyak (22.09.2007)
Просмотров: 1226 | Комментарии: 5 | Рейтинг: 5.0/1 |

Всего комментариев: 1
1 lilmImpoclown  
0
ОДНОКЛАССНИКИ ЗНАКОМСТВА

Имя *:
Email *:
Код *:
Форма входа

Поиск

Друзья сайта

Статистика

Copyright AMAR Inc. © 2025