Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/27: Рейтинг темы: голосов - 27, средняя оценка - 4.56
14 / 14 / 7
Регистрация: 10.01.2011
Сообщений: 146
1

Горячие клавиши - обойти наведение фокуса и привязать клавиши клавиатуры к кнопкам на форме

29.02.2012, 23:33. Просмотров 5090. Ответов 9
Метки нет (Все метки)

всем доброго времени суток. столкнулся с такой проблемой. требуется чтобы при нажатии определенных кнопок на клавиатуре соответственно срабатывали кнопки на форме (к примеру на нажатие пробела у меня должна срабатывать Button2, на Enter должна срабатывать Button3, на стрелки должен изменяться прогресс в Gauge).
пробовал описать эти кнопки в функции FormKeyDown. они срабатывают, но только на тех кнопках, на которые наведен фокус. есть ли возможность обойти наведение фокуса и привязать клавиши клавиатуры к кнопкам на форме?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.02.2012, 23:33
Ответы с готовыми решениями:

Как присваивать горячие клавиши к примеру на выполнение нажатие клавиши
Народ. не могу найти, как в студии присваивать горячие клавиши к примеру на выполнение нажатие...

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

Горячие клавиши: скрыть кнопки на форме
Как с помощью горячих клавиш сделать так, чтобы скрывались другие кнопки на форме?

Написать горячие клавиши для виртуальной клавиатуры
Всем доброго времени суток! Помогите пожалуйста,я прочитал многое на этом форуме,но свое так и не...

9
1358 / 728 / 66
Регистрация: 28.01.2011
Сообщений: 2,046
01.03.2012, 07:24 2
В инспекторе объектов главной формы KeyPreview поставь в положение true.
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if ((Key == 'L'))
      {
      Button1Click(Sender);
      }
}
1
Практикантроп
4565 / 2512 / 464
Регистрация: 23.09.2011
Сообщений: 5,403
01.03.2012, 12:46 3
Лучший ответ Сообщение было отмечено как решение

Решение

- установите нужные клавиши "горячими"__
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   RegisterHotKey(Handle,1,0,VK_SPACE);
   RegisterHotKey(Handle,3,0,VK_RETURN);
   RegisterHotKey(Handle,5,0,VK_LEFT);
   RegisterHotKey(Handle,6,0,VK_RIGHT);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
   UnregisterHotKey(Handle,1);
   UnregisterHotKey(Handle,3);
   UnregisterHotKey(Handle,5);
   UnregisterHotKey(Handle,6);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
 if ((Msg.message == WM_HOTKEY)&&(Msg.wParam == 1)) Button1Click(0);
 if ((Msg.message == WM_HOTKEY)&&(Msg.wParam == 3)) Button3Click(0);
 if ((Msg.message == WM_HOTKEY)&&(Msg.wParam == 5)) ProgressBar1->Position -=1;
 if ((Msg.message == WM_HOTKEY)&&(Msg.wParam == 6)) ProgressBar1->Position +=1;
}
3
4027 / 2317 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
01.03.2012, 17:19 4
Samrisbe, маленькая поправка, коли ТС пожелает использовать приведенный вами код - в обработчик Button1Click() не стоит передавать параметром Sender, ведь в этом случае туда прилетит указатель на форму, что может быть неожиданно в некоторых ситуациях. Лучше так:
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if ((Key == 'L'))
      {
      Button1Click(Button1); // передаем указатель на нажимаемую кнопку, раз уж мы знаем, что нажимаем
      }
}
1
14 / 14 / 7
Регистрация: 10.01.2011
Сообщений: 146
01.03.2012, 19:00  [ТС] 5
Samrisbe, BRcr проблема осталась. я попробовал записать на кнопку пробела код. итог - функцию вызывает 2 раза. и вызывает только на кнопке, у которой есть фокус
nick42 понятия не знаю в чем дело, но код не работал. реакции программы никакой
0
14 / 14 / 7
Регистрация: 10.01.2011
Сообщений: 146
14.03.2012, 20:08  [ТС] 6
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
 if ((Msg.message == WM_HOTKEY)&&(Msg.wParam == 1)) Button1Click(0);
 if ((Msg.message == WM_HOTKEY)&&(Msg.wParam == 3)) Button3Click(0);
 if ((Msg.message == WM_HOTKEY)&&(Msg.wParam == 5)) ProgressBar1->Position -=1;
 if ((Msg.message == WM_HOTKEY)&&(Msg.wParam == 6)) ProgressBar1->Position +=1;
}
куда создавать эту функцию?? что то не работает
0
4027 / 2317 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
14.03.2012, 20:21 7
Цитата Сообщение от cizer Посмотреть сообщение
что то не работает
Весьма информативно
Ошибки выдает? Успешность регистрации hotkeys проверяли? И не используете ли вы, случаем, параметр Sender в обработчиках Button1Click() и Button3Click()?
0
14 / 14 / 7
Регистрация: 10.01.2011
Сообщений: 146
14.03.2012, 21:04  [ТС] 8
ошибок не выдает, но и не работает. нажатия на кнопки не пытается отлавливать. функция TForm1::ApplicationEvents1Message описана была в protected. параметр Sender я тоже прописывал. не помогло

Добавлено через 5 минут
я пытался просто посмотреть есть ли вообще реакция на нажатия клавиш.
C++
1
2
3
if ((Msg.message == WM_HOTKEY)&&(Msg.wParam == 1)) {a++;Label3->Caption=IntToStr(a);}
 if ((Msg.message == WM_HOTKEY)&&(Msg.wParam == 5)) {b++;Label4->Caption=IntToStr(b);}
 if ((Msg.message == WM_HOTKEY)&&(Msg.wParam == 6)) {c++;Label5->Caption=IntToStr(c);}
Добавлено через 28 минут
все. разобрался с кодом. спасибо)
0
4027 / 2317 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
14.03.2012, 21:12 9
Цитата Сообщение от cizer Посмотреть сообщение
все. разобрался с кодом. спасибо)
Ну, дык и поведайте всем об этом - в чем крылась ваша проблема и как вы ее устранили?
Кому-нибудь это может пригодиться - прочитает и не наступит уже на ваши грабли.
1
14 / 14 / 7
Регистрация: 10.01.2011
Сообщений: 146
26.03.2012, 22:08  [ТС] 10
ну получается что код правильный. стоило в нем только разобраться.
объясню на примере:
C++
1
RegisterHotKey(Handle,1,0,VK_SPACE);
Handle - параметр менять не надо. 1 - индивидуальный код для сообщения, которое вы пытаетесь отловить, 0 - в данном случае служит параметром, что отлавливается только 1 нажатая клавиша (есть несколько вариантов сочетания), VK_SPACE - клавиша, которая отлавливается.

но вместе с тем появилась и новая проблема. я поставил отлавливание пробела. его отловило и сделало то что надо, но если открыты другие приложения, то в них пробел напрочь не работает!!! моя программа все равно его перехватывает. как это исправить???
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2012, 22:08

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Windows 7 Не работают горячие клавиши клавиатуры Defender Cascade 960
Доброго дня форумчане! Помогите, пожалуйста, кто знает. В новой клавиатуре в верхнем ряду не...

Отловить событие клавиши (стрелок клавиатуры) на форме
Пытаюсь поймать нажатия стрелок вверх и вниз (при чём, где бы оно не происходило (в пределах формы...

Связать нажатие и отжатие клавиши клавиатуры и кнопки на форме
Приветствую! Простейшая с виду задача. Нужно сделать так, чтобы при нажатии на клавишу М,...

Есть ли разница между программным посылом клавиши PostMessage и посылом клавиши при нажатии клавиатуры?
Всем привет) Может ерунду говорю, но.. Есть ли разница между программным посылом клавиши...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.