Форум: "Основная";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];
ВнизГорячие клавиши на форме! Найти похожие ветки
← →
kyn66 © (2007-03-15 15:13) [0]Не получив ответа, пытаюсь сформулировать вопрос по другому. Каким образом на форме отлавливать разные комбинации горячих клавишь, указанных пользователем в настройках программы и записаных в реестр, к примеру ???. Заношу в реестр посредством THotKey
WriteString("HotKey", "HotBufKey",hortCutToText(HotKey1.HotKey));
WriteString("HotKey", "HotDskKey",hortCutToText(HotKey2.HotKey));
занес две комбинации.
Как теперь на форме мне отлавливать эти комбинации и выполнять то или иное действие в зависимости от того, какая комбинация нажата ?
← →
Desdechado © (2007-03-15 15:26) [1]Зачем тебе в реестре клавиши для формы?
Используй TAction, Form.KeyPreview
← →
Leonid Troyanovsky © (2007-03-15 15:51) [2]
> Desdechado © (15.03.07 15:26) [1]
> Используй TAction, Form.KeyPreview
На второе, видимо, имелось ввиду FormShortCut.
Только оно, в данном случае, менее удобно.
--
Regards, LVT.
← →
kyn66 © (2007-03-15 15:54) [3]> Desdechado
Я не хочу обсуждать место хранения.... Механизм интересует (см. вопрос) Комбинации горячих клавишь заранее неизвестны.
← →
Сергей М. © (2007-03-15 15:56) [4]
> kyn66 © (15.03.07 15:54) [3]
> не хочу обсуждать место хранения.
Ну и какого же тогда хрена ты упоминаешь реестр, коли "не хочу обсуждать" ?)
> Комбинации горячих клавишь заранее неизвестны
Вот как будут известны, так и вызывай RegisterHotKey()
← →
kyn66 © (2007-03-15 16:29) [5]
> Ну и какого же тогда хрена ты упоминаешь реестр, коли "не
> хочу обсуждать" ?)
В вопросе внимание акцентировалось на механизме обработки введенной юзером комбинации, а не месте ее хранения !!! По поводу RegisterHotKey() вот ща смотрю, тока здесь загоняются в него уже известные комбинации. А в моем случае я могу получить что ввел юзер : типа "Shift+Ctrl+F12"/ И че дальше? Как мне енто добро прикрутить в RegisterHotKey() а потом на форме отлавливать именно такую комбинацию?
← →
Плохиш © (2007-03-15 16:37) [6]
> По поводу RegisterHotKey() вот ща смотрю, тока здесь загоняются
> в него уже известные комбинации. А в моем случае я могу
> получить что ввел юзер
Если пользователь что-то ввёл, то это уже становиться известной комбинацией.
> типа "Shift+Ctrl+F12"/ И че дальше?RegisterHotkey(self.Handle, 2, MOD_CTRL or MOD_SHIFT , VK_F12)
← →
Сергей М. © (2007-03-15 16:37) [7]
> kyn66 © (15.03.07 16:29) [5]
>
> В вопросе внимание акцентировалось на механизме обработки
> введенной юзером комбинации,
Да неужто ?!
Судя по слову "реестр" в твоем вопросе оно как раз и очевидно)
> ввел юзер : типа "Shift+Ctrl+F12"/ И че дальше?
Че, че .. ) .. парсер задействуй, вот "че")
А ты что, заставляешь юзера запомнить и писать потом все эти страшные слова (Shift, Ctrk, F12) ?)
Ну ты и садист, братец)
← →
kyn66 © (2007-03-15 17:15) [8]>Плохиш
> > типа "Shift+Ctrl+F12"/ И че дальше?RegisterHotkey(self.
> Handle, 2, MOD_CTRL or MOD_SHIFT , VK_F12)
Это по тексту понятно.... Парсер нужен.
>Сергей М.
Необязательно страшные комбинации. Все зависит от памяти юзверя, можно и "Ctrl+1" приклеить. А к томуже на форме у меня напоминалка ешшо пробегает с этой омбинацией ;-)
← →
Сергей М. © (2007-03-15 17:19) [9]
> kyn66 © (15.03.07 17:15) [8]
> Все зависит от памяти юзверя
Угу, как раз на это и следует уповать)
Память у юзверей следует дрессировать)
Или гнать в шею "бабаклав", не способных воспроизвести на "бабоклавиатуре" страшное слово "Ctrl+1")
← →
kyn66 © (2007-03-15 17:55) [10]Вижу обсуждение перешло в флудовское русло
← →
GrayFace © (2007-03-15 18:36) [11]В пределах формы - создай PopupMenu, настрой на нее Form.PopupMenu и в OnContextPopup сделай Handled:=false; потом меняй ShortCut-ы пунктов.
Парсер не нужен, в Menus есть TextToShortCut.
← →
kyn66 © (2007-03-16 09:18) [12]>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-16 16:01) [13]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-19 09:42) [14]
> Это только для dll нужно, в exe можно использовать любые
> индексы от 0 до $BFFF. Причем в dll названия должны быть
> не "HotKey1", а уникальные для твоего приложения.
А можно конкретнее про это место? А как узнать, не занято-ли это место уже?
← →
kyn66 © (2007-03-19 10:32) [15]>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
← →
GrayFace © (2007-03-19 20:09) [16]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-23 09:59) [17]
> А откуда ты THotKey этот взял?
Ну как, вместо компонента, ты-ж сам предлагал такой вариант, чтобы не использовать промежуточный компонент
← →
GrayFace © (2007-03-23 21:33) [18]Я перепутал с TShortCut. У меня класса THotKey вообще нету.
← →
Dismember © (2007-03-24 08:24) [19]А можно мне небольшой вопрос? :)
Как научить стандартный THotKey отлавливать мультимедийные кнопки на клавиатуре наподобие того, как это сделано в винампе? Обычные сочетания клавиш работают, но хотелось бы еще привлечь мультимедиа кнопки.
← →
GrayFace © (2007-03-24 17:30) [20]Вот их коды:
mute 173
gromk- 174
gromk+ 175
-> 176
<- 177
[] 178
> 179
← →
Dismember © (2007-03-24 18:27) [21]Коды это конечно хорошо, но в самом компоненте HotKey при задании любой клавиши печатаются буквы латинского алфавита, а хотелось бы что-нибудь типа "Next Track", наподобие того, как это сделано в Winamp 5x. Да, и существует ли код для клавиши play/pause?
← →
GrayFace © (2007-03-24 20:48) [22]Dismember © (24.03.07 18:27) [21]
Коды это конечно хорошо, но в самом компоненте HotKey при задании любой клавиши печатаются буквы латинского алфавита, а хотелось бы что-нибудь типа "Next Track", наподобие того, как это сделано в Winamp 5x.
А, теперь вспомнил, что такое THotKey. Не знаю, не пробовал.
Dismember © (24.03.07 18:27) [21]
Да, и существует ли код для клавиши play/pause?
> 179
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.034 c