![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Горячие клавиши на форме! [D7, WinXP]
kyn66 © (2007-03-15 15:13:00)Не получив ответа, пытаюсь сформулировать вопрос по другому. Каким образом на форме отлавливать разные комбинации горячих клавишь, указанных пользователем в настройках программы и записаных в реестр, к примеру ???. Заношу в реестр посредством THotKey
WriteString('HotKey', 'HotBufKey',hortCutToText(HotKey1.HotKey));
WriteString('HotKey', 'HotDskKey',hortCutToText(HotKey2.HotKey));
занес две комбинации.
Как теперь на форме мне отлавливать эти комбинации и выполнять то или иное действие в зависимости от того, какая комбинация нажата ?
GrayFace (2007-03-24 20:48:00) [1]Dismember © (24.03.07 18:27) [21]
Коды это конечно хорошо, но в самом компоненте HotKey при задании любой клавиши печатаются буквы латинского алфавита, а хотелось бы что-нибудь типа "Next Track", наподобие того, как это сделано в Winamp 5x.
А, теперь вспомнил, что такое THotKey. Не знаю, не пробовал.
Dismember © (24.03.07 18:27) [21]
Да, и существует ли код для клавиши play/pause?
> 179
Dismember (2007-03-24 18:27:00) [2]Коды это конечно хорошо, но в самом компоненте HotKey при задании любой клавиши печатаются буквы латинского алфавита, а хотелось бы что-нибудь типа "Next Track", наподобие того, как это сделано в Winamp 5x. Да, и существует ли код для клавиши play/pause?
GrayFace (2007-03-24 17:30:00) [3]Вот их коды:
mute 173
gromk- 174
gromk+ 175
-> 176
<- 177
[] 178
> 179
Dismember (2007-03-24 08:24:00) [4]А можно мне небольшой вопрос? :)
Как научить стандартный THotKey отлавливать мультимедийные кнопки на клавиатуре наподобие того, как это сделано в винампе? Обычные сочетания клавиш работают, но хотелось бы еще привлечь мультимедиа кнопки.
GrayFace (2007-03-23 21:33:00) [5]Я перепутал с TShortCut. У меня класса THotKey вообще нету.
kyn66 (2007-03-23 09:59:00) [6]
> А откуда ты THotKey этот взял?
Ну как, вместо компонента, ты-ж сам предлагал такой вариант, чтобы не использовать промежуточный компонент
GrayFace (2007-03-19 20:09:00) [7]kyn66 © (19.03.07 9:42) [14]
А можно конкретнее про это место? А как узнать, не занято-ли это место уже?
Этим диапазоном твоя программа может распоряжаться как хочет. Если у тебя 2 горячих клавиши, то и давай им 0 и 1, например. Потом в TGenTFrm.WMHotKey их по id'ам различай.
procedure TGenTFrm.RegHotKey(const UserName : String; Id: Integer);
var
modif : UINT;
K : Word;
SS : TShiftState;
HK : TShortCut;
begin
modif := 0;
HK := TextToShortCut(UserName);
if HK and scCtrl <> 0 then modif := modif + MOD_CONTROL;
if HK and scAlt <> 0 then modif := modif + MOD_ALT;
if HK and scShift <> 0 then modif := modif + MOD_SHIFT;
RegisterHotKey(Handle, Id, Modif, Byte(HK));
end;
Оставил UserName, хотя очень странное имя для строки с горячей клавишей.
kyn66 © (19.03.07 10:32) [15]
Вызов :
// Регистрация первой горячей комбинации
RegHotKey(Opt_A.HotBufStr, 'HotKey1');
// Регистрация второй горячей комбинации
RegHotKey(Opt_A.HotDiskStr, 'HotKey2');
Тут строки 'HotKey1' и 'HotKey2' должны быть уникальными. Хотя в данном случае это вообще не нужно:
RegHotKey(Opt_A.HotBufStr, 0);
RegHotKey(Opt_A.HotDiskStr, 1);
А откуда ты THotKey этот взял?
kyn66 (2007-03-19 10:32:00) [8]>GrayFace
Сделал отдельную процедуру:
procedure TGenTFrm.RegHotKey(UserName, GlobalName : String);
Var
modif : Integer;
K : Word;
SS : TShiftState;
HK : THotKey;
begin
modif := 0;
HK := THotKey.Create(Self);
HK.HotKey := TextToShortCut(UserName);
if (hkCtrl in HK.Modifiers) then modif := modif + MOD_CONTROL;
if (hkAlt in HK.Modifiers) then modif := modif + MOD_ALT;
if (hkShift in HK.Modifiers) then modif := modif + MOD_SHIFT;
ShortCutToKey(HK.HotKey, K, SS);
id1 := GlobalAddAtom(PAnsiChar(GlobalName));
RegisterHotKey(Handle, id1, Modif, K);
HK.Free;
end;
...
Вызов :
// Регистрация первой горячей комбинации
RegHotKey(Opt_A.HotBufStr, 'HotKey1');
// Регистрация второй горячей комбинации
RegHotKey(Opt_A.HotDiskStr, 'HotKey2');
...
но вываливать стала ошибка странная, не пойму в чем дело
ОШИБКА --> http://yurec66.narod.ru/Vopros/Error.jpg
kyn66 (2007-03-19 09:42:00) [9]
> Это только для dll нужно, в exe можно использовать любые
> индексы от 0 до $BFFF. Причем в dll названия должны быть
> не 'HotKey1', а уникальные для твоего приложения.
А можно конкретнее про это место? А как узнать, не занято-ли это место уже?
GrayFace (2007-03-16 16:01:00) [10]kyn66 © (16.03.07 9:18) [12]
Этот код регистрирует "глобальные" горячие клавиши - они будут срабатывать даже когда твое приложение не активно.
kyn66 © (16.03.07 9:18) [12]
Можно-ли этот код как-то упростить, дабы не прибегая к промежуточным компонентам ?
Вместо HK1.HotKey использовать переменную тапа THotKey :) И выделить регистрацию 1 гор. клавиши в отдельную функцию.
kyn66 © (16.03.07 9:18) [12]
GlobalAddAtom
Это только для dll нужно, в exe можно использовать любые индексы от 0 до $BFFF. Причем в dll названия должны быть не 'HotKey1', а уникальные для твоего приложения.
kyn66 (2007-03-16 09:18:00) [11]>GrayFace
Спасибо за предложенный вариант. Пока не проверяя хочу спросить по такому вопросу. Я нашел ешшо один вариант. Но и в предложенном сейчас и в моем приходится прибегать к помощи дополнительных компонентов. В моем примере мне пришлось положить на форму два невидимых THotKey. Вот что из этого получается. Можно-ли этот код как-то упростить, дабы не прибегая к промежуточным компонентам ?
procedure TGenTFrm.FormCreate(Sender: TObject);
Var
modif : Integer;
K : Word;
SS : TShiftState;
begin
// Регистрация первой горячей комбинации
modif := 0;
HK1.HotKey := TextToShortCut(Opt_A.HotBufStr);
if (hkCtrl in HK1.Modifiers) then modif := modif + MOD_CONTROL;
if (hkAlt in HK1.Modifiers) then modif := modif + MOD_ALT;
if (hkShift in HK1.Modifiers) then modif := modif + MOD_SHIFT;
ShortCutToKey(HK1.HotKey, K, SS);
id1 := GlobalAddAtom('HotKey1');
RegisterHotKey(Handle, id1, Modif, K);
// Регистрация второй горячей комбинации
modif := 0;
HK2.HotKey := TextToShortCut(Opt_A.HotDiskStr);
if (hkCtrl in HK2.Modifiers) then modif := modif + MOD_CONTROL;
if (hkAlt in HK2.Modifiers) then modif := modif + MOD_ALT;
if (hkShift in HK2.Modifiers) then modif := modif + MOD_SHIFT;
ShortCutToKey(HK2.HotKey, K, SS);
id2 := GlobalAddAtom('HotKey2');
RegisterHotKey(Handle, id2, Modif, K);
end;
GrayFace (2007-03-15 18:36:00) [12]В пределах формы - создай PopupMenu, настрой на нее Form.PopupMenu и в OnContextPopup сделай Handled:=false; потом меняй ShortCut-ы пунктов.
Парсер не нужен, в Menus есть TextToShortCut.
kyn66 (2007-03-15 17:55:00) [13]Вижу обсуждение перешло в флудовское русло
Сергей М. (2007-03-15 17:19:00) [14]
> kyn66 © (15.03.07 17:15) [8]
> Все зависит от памяти юзверя
Угу, как раз на это и следует уповать)
Память у юзверей следует дрессировать)
Или гнать в шею "бабаклав", не способных воспроизвести на "бабоклавиатуре" страшное слово "Ctrl+1")
kyn66 (2007-03-15 17:15:00) [15]>Плохиш
> > типа "Shift+Ctrl+F12"/ И че дальше?RegisterHotkey(self.
> Handle, 2, MOD_CTRL or MOD_SHIFT , VK_F12)
Это по тексту понятно.... Парсер нужен.
>Сергей М.
Необязательно страшные комбинации. Все зависит от памяти юзверя, можно и "Ctrl+1" приклеить. А к томуже на форме у меня напоминалка ешшо пробегает с этой омбинацией ;-)
Сергей М. (2007-03-15 16:37:00) [16]
> kyn66 © (15.03.07 16:29) [5]
>
> В вопросе внимание акцентировалось на механизме обработки
> введенной юзером комбинации,
Да неужто ?!
Судя по слову "реестр" в твоем вопросе оно как раз и очевидно)
> ввел юзер : типа "Shift+Ctrl+F12"/ И че дальше?
Че, че .. ) .. парсер задействуй, вот "че")
А ты что, заставляешь юзера запомнить и писать потом все эти страшные слова (Shift, Ctrk, F12) ?)
Ну ты и садист, братец)
Плохиш (2007-03-15 16:37:00) [17]
> По поводу RegisterHotKey() вот ща смотрю, тока здесь загоняются
> в него уже известные комбинации. А в моем случае я могу
> получить что ввел юзер
Если пользователь что-то ввёл, то это уже становиться известной комбинацией.
> типа "Shift+Ctrl+F12"/ И че дальше?
RegisterHotkey(self.Handle, 2, MOD_CTRL or MOD_SHIFT , VK_F12)
kyn66 (2007-03-15 16:29:00) [18]
> Ну и какого же тогда хрена ты упоминаешь реестр, коли "не
> хочу обсуждать" ?)
В вопросе внимание акцентировалось на механизме обработки введенной юзером комбинации, а не месте ее хранения !!! По поводу RegisterHotKey()вот ща смотрю, тока здесь загоняются в него уже известные комбинации. А в моем случае я могу получить что ввел юзер : типа "Shift+Ctrl+F12"/ И че дальше? Как мне енто добро прикрутить в RegisterHotKey()а потом на форме отлавливать именно такую комбинацию?
Сергей М. (2007-03-15 15:56:00) [19]
> kyn66 © (15.03.07 15:54) [3]
> не хочу обсуждать место хранения.
Ну и какого же тогда хрена ты упоминаешь реестр, коли "не хочу обсуждать" ?)
> Комбинации горячих клавишь заранее неизвестны
Вот как будут известны, так и вызывай RegisterHotKey()
kyn66 (2007-03-15 15:54:00) [20]> Desdechado
Я не хочу обсуждать место хранения.... Механизм интересует (см. вопрос) Комбинации горячих клавишь заранее неизвестны.