| Автор
| Сообщение |
|
|
|
Цитата |
|
Подскажите пож,
как создать "hotKey" на три кнопки(например Ctrl+Chift+P).
я это сделал через getkeystate(извините за синтаксис, если что не так)
функция вызывается через "OnTimer".
Есть ли возможность это все через Message произвести, а то работает как-то заторможенно, да и выглядит некрасиво. |
|
| В начало |
|
 |
|
|
 |
 Gelios
Oracle-вый маньяк, Админ

Возраст: 37
Знак зодиака: 
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
|
|
|
Цитата |
|
один из способов
создаешь action, указываешь там нужную тебе комбинацию, и потом этот акшин назначаешь буттоне или менюшке... _________________ нельзя давать всем всего, ибо всех много, а всего мало |
|
| В начало |
|
 |
|
|
|
Цитата |
|
Уважаемый Гелиос!
Если возможно-чуть подробнее  |
|
| В начало |
|
 |
 Gelios
Oracle-вый маньяк, Админ

Возраст: 37
Знак зодиака: 
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
|
|
|
Цитата |
|
1. Кидаешь на форму TActionList
2. Дважды на нем кликаешь
3. Создаешь новый action
4. Заполняешь свойства Caption, Hint
5. В свойстве ShortCut выбираешь когрячую клавишу
6. Можешь указать дополнительняе горячие клавиши в SecondaryShortCuts
7. Пишешь обработчик OnExecute
8. кидаешь на форму буттон указываешь в свойстве Action созданный акшин
9. или создаешь меню, где в одном из пуктов тоже указываешь в свойстве Action этот акшин
10. либо делаешь 8 и 9.
вот собственно и все )))
Можно еще заюзать TActionManager, он позволяет в рунтайме настраивать ActionMainMenuBar и ActionToolBar.
Но для начала разберись c TActionList _________________ нельзя давать всем всего, ибо всех много, а всего мало |
|
| В начало |
|
 |
 Gelios
Oracle-вый маньяк, Админ

Возраст: 37
Знак зодиака: 
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
|
|
|
Цитата |
|
1. Кидаешь на форму TActionList
2. Дважды на нем кликаешь
3. Создаешь новый action
4. Заполняешь свойства Caption, Hint
5. В свойстве ShortCut выбираешь когрячую клавишу
6. Можешь указать дополнительняе горячие клавиши в SecondaryShortCuts
7. Пишешь обработчик OnExecute
8. кидаешь на форму буттон указываешь в свойстве Action созданный акшин
9. или создаешь меню, где в одном из пуктов тоже указываешь в свойстве Action этот акшин
10. либо делаешь 8 и 9.
вот собственно и все )))
Можно еще заюзать TActionManager, он позволяет в рунтайме настраивать ActionMainMenuBar и ActionToolBar.
Но для начала разберись c TActionList _________________ нельзя давать всем всего, ибо всех много, а всего мало |
|
| В начало |
|
 |
|
|
|
Цитата |
|
Спасибо за совет-все работает хорошо.
Однако событие обрабатывается только в случае, если форма активна,
еслижефокус ввода находится в другом прилочении, то "горячие" клавиши уже не обрабатываются, а меня интересует обработка НОТ КЕУ именно в этом режиме.
всего доброго. |
|
| В начало |
|
 |
DrPass
Знающий :) /Почетный Модератор/

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
Хм. Это, дорогой человек, уже называется хук, а не хоткей. См. функцию SetWindowsHookEx _________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
|
|
|
Цитата |
|
Большое Спасибо : Dr.Pass
- Пойду копать |
|
| В начало |
|
 |
|
|
|
Цитата |
|
А я бы использовал RegisterHotKey. Гораздо проще и удобнее. Не надо никаких хуков на систему и ActionList. Тем более, что после этой функции клавиши считываются даже если прога неактивна.
P.S. Не забудь удалить HotKey при уничтожении программы |
|
| В начало |
|
 |
|
|
 |
DrPass
Знающий :) /Почетный Модератор/

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
Я юзаю SetWindowsHookEx потому, что бывают ситуации, когда на компе может оказаться еще какая-нибудь программа-любительница RegisterHotKey. А в этом случае "горячими клавишами", возможно, придется делиться...
Ну а по сложности реализации - в принципе, одинаково _________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
|
|
|
Цитата |
|
Я поковырялся с этим делом и нашел интересную инфу. При установке хука надо отловить сообщение
WM_KEYDOWN
Уведомляет окно с фокусом, что была нажата несистемная клавиша.
Паpаметpы:
wParam: Является кодом виpтуальной клавиши.
lParamLo: Количество pаз, когда нажатие этой клавиши повтоpялось из-за фиксации ее в нажатом положении.
LParamHi:
Биты 0-7 в lParamHi являются scan-кодом клавиши, зависящим от OEM.
Бит 8 pавен 1, если клавиша относится к pасшиpенным.
Бит 13 pавен 1, если пpи нажатии клавиши нажималась клавиша Alt. Если клавиша уже была нажата до посылки этого сообщения, бит 14 pавен 1.
Бит 15 pавен 1, если клавиша отпускается, и pавен 0, если нажимается.
Возвpащаемое значение: Не используется.
Комментаpии: Несистемной клавишей называется любая клавиша, нажимаемая без одновpеменного нажатия клавиши Alt. Для этого сообщения биты 13 и 15 в lParamHi будут нулевыми. Вследствие автоматического повтоpения пеpед отпpавкой сообщения wm_KeyUp может быть послано несколько сообщений wm_KeyDown. Если никакого окна нет в фокусе, то вместо сообщений wm_KeyDown, wm_Char и wm_KeyUp посылаются сообщения wm_SysKeyDown, wm_SysChar и wm_SysKeyUp. См. также wm_DeadChar,
wm_SysChar и wm_SysDeadChar.
Теперь у меня только один вопрос: а как эти самые биты прочитать??? |
|
| В начало |
|
 |
DrPass
Знающий :) /Почетный Модератор/

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
??? Логическими операциями, естессно
Например, if hiword(lparam) and $3000 > 0 then бит 13 равен 1
Обрати внимание на отсутствие привычных скобок при использовании and _________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
|
|
|
Цитата |
|
А зачем мучаться и читать биты
Проще сделать так
WM_KEYDOWN:
begin
if (DWord(GetAsyncKeyState(VK_CONTROL)) and $8000) <> 0 then ...
{
тогда нажат Ctrl
можно применять и для других клавиш
}
end; |
|
| В начало |
|
 |
|