Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2008, 23:45   #1
NeiL
Пользователь
 
Регистрация: 28.11.2007
Сообщений: 49
По умолчанию OnShortCut

Народ, подскажите, как на событии OnShortCut формы сделать комбинированный ShortCut, например (CONTROL + F3).
С одной клавишей все ясно, а вот сдвумя никак...

procedure TForm1.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
if Msg.CharCode = VK_F3 then
ShowMessage('');
end;
NeiL вне форума Ответить с цитированием
Старый 01.04.2008, 01:18   #2
Viteef
stopfake.org
Участник клуба
 
Регистрация: 03.05.2007
Сообщений: 1,927
По умолчанию

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_a ctivate).

Журнал "Программист", №5
Viteef вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц