Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 06.04.2019
Сообщений: 59
1

Горячие клавиши при свернутом в трей приложении

12.11.2019, 08:44. Просмотров 298. Ответов 1
Метки нет (Все метки)

Здравствуйте,пишу небольшую программу в которой необходимо реализовать горячие клавиши так, что бы когда программа была свернута она перехватывала нажатые клавиши.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2019, 08:44
Ответы с готовыми решениями:

Вызвать меню в другом приложении свернутом в трей
Пытаюсь функцией PostMessage(hWnd, WM_RBUTTONDOWN, 0,0); вызвать меню приложения которое...

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

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

Горячие клавиши в приложении не работают
Здравствуйте. Пишу менюшку для программы, но не получается забить на хоткеи действия. ЧЯДНТ?...

1
случайный прохожий
1489 / 970 / 372
Регистрация: 20.07.2013
Сообщений: 2,839
15.11.2019, 02:15 2
В этой теме посмотри "про трей": Отображение скрытого в трее окна программы при попытке запуска ее копий
Далее (по хоткеям): добавляешь на форму TApplicationEvents
Регистрируешь горячие клавиши (или их комбинации) с помощью функции RegisterHotKey(), убираешь (когда не нужно) через UnregisterHotKey
В методе OnMessage (для TApplicationEvents) прописываешь действия, выполняемые при нажатии горячих клавиш.
Пример (key-и - это численные значения наших горячих клавиш):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled)
{
if (Msg.message == WM_HOTKEY)
 {
  if (Msg.wParam == key1)
    join_room->Click();
  else
   if (Msg.wParam == key2 && !tunnel_test->Tag)
   {
     tunnel_test->Click();
     tunnel_test->Tag = 1;
     Timer4->Enabled = 1;
     Label4->Caption = "туннель комнаты с помощью хоткея будет доступен через 30 секунд";
     Timer5->Enabled = 1;
   }
  else
   if (Msg.wParam == key3)
    tunnel_on_host->Click();
  else
   if (Msg.wParam == key4)
    player_tunnel->Click();
 }
}
Пример регистрации горячих клавиш (код "старый, но не бесполезный"):
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
UINT mods(TShiftState modifs)
{
  UINT iModifiers = 0;
  if (modifs.Contains(ssShift))
    iModifiers += MOD_SHIFT;
  if (modifs.Contains(ssCtrl))
    iModifiers += MOD_CONTROL;
  if (modifs.Contains(ssAlt))
    iModifiers += MOD_ALT;
  return iModifiers;
}
//---------------------------------------------------------------------------
AnsiString hk(unsigned short ShortCut)
{
  AnsiString hk0 = AnsiReplaceText(ShortCutToText(ShortCut), "+", " + ");
  if (hk0 == "")
    hk0 = "нет хоткея";
  return hk0;
}
//---------------------------------------------------------------------------
void __fastcall ShowHKsMain()
{
  Form1->join_room->Caption = "вход в комнату (" + hk(Form2->HotKey1->HotKey) + ")";
  Form1->tunnel_test->Caption = "туннель игроков в комнате (" + hk(Form2->HotKey2->HotKey) + ")";
  Form1->tunnel_on_host->Caption = "туннель игроков на хосте (" + hk(Form2->HotKey3->HotKey) + ")";
  Form1->player_tunnel->Caption = "туннель игрока (" + hk(Form2->HotKey4->HotKey) + ")";
}
//---------------------------------------------------------------------------
void __fastcall RegisterHKs()
{
  Word key;
  TShiftState modifs;
 
  ShortCutToKey(Form2->HotKey1->HotKey, key, modifs);
//  ShowMessage(String(HotKey1->HotKey) + "   " + "key = " + String(key) + "   " + String(modifs.ToInt()) + "   " + ShortCutToText(HotKey1->HotKey) + "   " + String(HotKey1->Modifiers.ToInt()));
//  ShowMessage("MOD_SHIFT = " + String(MOD_SHIFT) + "   MOD_ALT = " + String(MOD_ALT) + "   MOD_CONTROL = " + String(MOD_CONTROL));
  RegisterHotKey(Form1->Handle,Form1->key1,mods(modifs),key);
 
  ShortCutToKey(Form2->HotKey2->HotKey, key, modifs);
  RegisterHotKey(Form1->Handle,Form1->key2,mods(modifs),key);
 
  ShortCutToKey(Form2->HotKey3->HotKey, key, modifs);
  RegisterHotKey(Form1->Handle,Form1->key3,mods(modifs),key);
 
  ShortCutToKey(Form2->HotKey4->HotKey, key, modifs);
  RegisterHotKey(Form1->Handle,Form1->key4,mods(modifs),key);
}
//---------------------------------------------------------------------------
Можно еще использовать "атомы" (как защиту от дублирования численных значениф) для регистрации хоткеев, но и без них обойтись вполне возможно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  key1 = GlobalAddAtom("enter room");
  key2 = GlobalAddAtom("tunnel room");
  key3 = GlobalAddAtom("tunnel on host");
  key4 = GlobalAddAtom("player tunnel");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  UnregisterHotKey(Handle,key1);
  UnregisterHotKey(Handle,key2);
  UnregisterHotKey(Handle,key3);
  UnregisterHotKey(Handle,key4);
  GlobalDeleteAtom(key1);
  GlobalDeleteAtom(key2);
  GlobalDeleteAtom(key3);
  GlobalDeleteAtom(key4);
}
Изложил сумбурно, но все это гуглится очень легко и просто, что я и делал (вполне успешно), когда мне это самому было нужно несколько лет назад.
0
Миниатюры
Горячие клавиши при свернутом в трей приложении  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2019, 02:15

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

Горячие клавиши в консольном приложении
Использую следующие классы HotKeyManager: public static class HotKeyManager { public...

Получения событий при свернутом приложении
Нужно получать координаты нажатия мыши при свернутом java приложении. Возможно ли это сделать с JVM?

Обработка событий при свернутом приложении
Добрый день. Подскажите пожалуйста, как обрабатывать событие в свернутом приложении. Допустим мне...

Распознавание нажатых клавиш при свёрнутом приложении
допустим что приложение было свёрнуто, как можно сделать так, чтобы оно разворачивалось при нажатии...

Горячие клавиши (Ошибка при создании дескриптора окна)
public partial class ShotForm : Form { public static extern int...

Не работают горячие клавиши при русской клавиатуре в Photoshop CS5
У меня фотошоп CS5. С недавнего времени перестали работать горячие клавиши при русской клавиатуре...


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

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

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