0 / 0 / 1
Регистрация: 06.09.2010
Сообщений: 61

Горячие клавиши

19.09.2010, 16:50. Показов 3445. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Есть вопрос - можно ли в Delphi использовать комбинации клавиш Alt+1, Alt+2, Alt+3, Alt+4, Alt+5, Alt+6?
Есть 6 RadioButton. Желательно, чтобы каждая соответствовала комбинации: Alt+1 = RadioButton1, Alt+2 = RadioButton2 и т.д
Я хочу сделать, чтобы эти комбинации использовались по очереди. Т.е Если взять Button1, при её нажатии запускается комбинация Alt+1. После выполнения (к примеру кликом мыши), запускается Alt+2 и т.д Затем после нажатия на Button2 процесс останавливается.
Есть люди, кто силён в таких областях? Очень нужна помощь. Заранее благодарен.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.09.2010, 16:50
Ответы с готовыми решениями:

Горячие клавиши
Подскажите пожалуйста как мне назначить какоето действие на горячие клавиши : F1,F2..ну и тд..

Горячие клавиши
Как с помощью HotKey сделать назначение клавиш, к примеру включение/отключение звука в системе на букву "б", а при желании через...

Горячие клавиши
Как прописать вызов горячих клавиш? Например, вызов печати на CTRL+P или поиска на CTRL+F? Спасибо.:)

5
 Аватар для igoriy
873 / 544 / 117
Регистрация: 24.11.2009
Сообщений: 1,329
19.09.2010, 17:41
Delphi
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
type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure ALT_N(var Message:TMessage);message WM_HOTKEY;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
{ TForm1 }
 
procedure TForm1.ALT_N(var Message: TMessage);
begin
 ShowMessage('Получилось');
 
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 RegisterHotKey(Handle,0,MOD_ALT,$31);// зарегить хук
 //Если такое сочетание уже зарегено, то функция вернет false,
 //надо выбрать другое сочетание кнопок.
 
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
 UnRegisterHotKey(Handle,0);// отменить регистрацию хука
end;
 
end.
Добавлено через 42 секунды
Данное сочетание ALT+1

Добавлено через 9 минут
Здесь нажимая на кнопку получаешь сочетание ALT+1

Delphi
1
2
3
4
5
6
7
8
procedure TForm1.Button1Click(Sender: TObject);
begin
keybd_event($12,0,0,0);
keybd_event(byte('1'),0,0,0);
keybd_event(byte('1'),0,KEYEVENTF_KEYUP,0);
keybd_event($12,0,KEYEVENTF_KEYUP,0);
 
end;
0
КотЪ
 Аватар для Zabiyak
219 / 219 / 60
Регистрация: 26.05.2009
Сообщений: 688
20.09.2010, 12:33
Если глобальный хук не нужен (или такая комбинация уже захукана в Виндовс), то можно сделать невидимый пункт МейнМеню и поставить ему ShortCut. Но тут виды комбинаций ограничены.

А самый простой вариант - в названии РадиоБатонов использовать цифры соответственно 1,2...6 и перед ними в Caption записать символ '&'. Тогда эти цифры подчеркнутся и будут реагировать на нажатие соотв кнопок вместе с Альтом
0
0 / 0 / 1
Регистрация: 06.09.2010
Сообщений: 61
20.09.2010, 15:32  [ТС]
Исправлю свой вопрос, так как считаю его не полным.
Есть форма, на ней 6 CheckButton (Случайно спутал с RadioButton). Желательно чтобы каждая соответствовала комбинации клавиш.
Хочу сделать, чтобы эти горячие клавиши работали в определённом процессе (программе).
Т.е нажимаем на кнопку Button1, в Memo1 прописывается строчка к примеру - 'Alt+1 HotKey start' и в процессе активируется комбинация. После её выполнения, в Memo1 появляется строчка 'Alt+2 HotKey start' и так, пока все 6 комбинаций не будут выполнены. За тем, вся процедура начинается заново.

Zabiyak Спасибо за совет, обязательно по-пытаюсь по-пробовать.
0
КотЪ
 Аватар для Zabiyak
219 / 219 / 60
Регистрация: 26.05.2009
Сообщений: 688
20.09.2010, 18:06
Если же всё будет происходить программно, то вместо хоткея можно просто вызвать событие
Delphi
1
RadioButton1.OnClick(Sender);
в той части процесса, где это нужно.
А в самом обработчике РадиоБатона прописать Чекед вручную:
procedure TForm1.RadioButton1Click(Sender: TObject);
Delphi
1
2
3
4
  begin
    RadioButton1.Checked:= true;
    //your code
  end;
0
0 / 0 / 1
Регистрация: 06.09.2010
Сообщений: 61
01.10.2010, 10:00  [ТС]
Вопос решён на 80%. Дело в том, что на форме 2 кнопки и таймер (CheckBos'ы и Memo убрал) Суть в том, что при нажатии на ктопку "Старт", в определённом окне, происходит сочетание клавиш Alt+1... Alt+6, вроде - всё, что и требовалось, но эти сочетания не выполняются по очерёдности, а перепрыгивают, т.е Alt+1... Alt+3... Alt+6 или Alt+2... Alt+6 и т.д
Вопрос - как заставить программу, проверять по указанным адресам, что слоты пусты и выполнять далее?
Исходник:
Delphi
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    Button2: TButton;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  NadoLechitsa: Boolean;
  HotKey: Byte;
  hpMax, hpKritichMin, GetZdorovye, hpNormal: Integer;
  WindowName              :Integer;
  Buf                     :PChar;
  HandleWindow            :Integer;
  WindowTitle             :String= 'Имя_Окна';
 
implementation
 
procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean);
 type
   TShiftKeyInfo = record
     shift: Byte;
     vkey: Byte;
   end;
   byteset = set of 0..7;
 const
   shiftkeys: array [1..3] of TShiftKeyInfo =
     ((shift: Ord(ssCtrl); vkey: VK_CONTROL),
     (shift: Ord(ssShift); vkey: VK_SHIFT),
     (shift: Ord(ssAlt); vkey: VK_MENU));
 var
   flag: DWORD;
   bShift: ByteSet absolute shift;
   i: Integer;
 begin
   for i := 1 to 3 do
   begin
     if shiftkeys[i].shift in bShift then
       keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0);
   end; { For }
   if specialkey then
     flag := KEYEVENTF_EXTENDEDKEY
   else
     flag := 0;
 
   keybd_event(key, MapvirtualKey(key, 0), flag, 0);
   flag := flag or KEYEVENTF_KEYUP;
   keybd_event(key, MapvirtualKey(key, 0), flag, 0);
 
   for i := 3 downto 1 do
   begin
     if shiftkeys[i].shift in bShift then
       keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0),
         KEYEVENTF_KEYUP, 0);
   end; { For }
 end; { PostKeyEx32 }
 
{$R *.dfm}
 
function Find(s: string): hWnd;
var
  Wnd: hWnd;
  buff: array[0..127] of Char;
begin
  Find := 0;
  Wnd := GetWindow(application.Handle, gw_HWndFirst);
  while Wnd <> 0 do
  begin
    if (Wnd <> application.Handle) and
    IsWindowVisible(Wnd) and
    (GetWindow(Wnd, gw_Owner) = 0) and
    (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) then
    begin
      GetWindowText(Wnd, buff, sizeof(buff));
      if pos(s, StrPas(buff)) > 0 then
      begin
        Find := Wnd;
        Break;
      end;
    end;
    Wnd := GetWindow(Wnd, gw_hWndNext);
  end;
end;
 
function read_value (Addres:cardinal;ByteType:integer;var GetValue:int64):boolean;
var
  PID,PH:cardinal;
  rw:cardinal;
  exec:boolean;
  H:HWND;
begin
try
  h:=find(windowtitle);
  exec:=true;
  if h=0 then
    exec:=false;
  getwindowthreadprocessid(h,PID);
  PH:=openprocess(process_all_access,false,PID);
  if PH=0 then
    exec:=false;
  if readprocessmemory(PH,ptr(Addres),@GetValue,ByteType,rw)=false then
    exec:=false;
  closehandle(PH);
  result:=exec;
  finally
end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  res: int64;
begin
  res:=0;
  read_value($49DBFC,1, res);
  hpMax:=(res);
  hpKritichMin:= Round (hpMax * 0.2);
  hpNormal:= Round (hpMax * 0.8);
  NadoLechitsa:= False;
  HotKey:= Ord ('1');
  Timer1.Enabled:=True;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled:=False;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
  HitPoints: Integer;
begin
  HitPoints := GetZdorovye;
 
  NadoLechitsa := (HitPoints < hpKritichMin)
  or (NadoLechitsa and (HitPoints < hpNormal));
  if NadoLechitsa
  then PostKeyEx32(HotKey, [ssAlt], False);
 
  Inc (HotKey);
  if HotKey = Ord ('7') then Timer1.Enabled := False;
end;
 
end.
Слот Alt+1: $0049DE9С
Слот Alt+2: $0049DEA0
Слот Alt+3: $0049DEA4
Слот Alt+4: $0049DEA8
Слот Alt+5: $0049DEAC
Слот Alt+6: $0049DEB0
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.10.2010, 10:00
Помогаю со студенческими работами здесь

Горячие клавиши
Здравствуйте, как прикрепить горячие клавиши к Button. Например есть процедура: procedure TForm1.Button2Click(Sender: TObject); var ...

Горячие клавиши
Как сделать что бы при нажатии клавиш Ctrl+Z выполнялось a:=a+1;

Горячие клавиши
Как сделать так, чтобы, например, по нажатию нескольких клавиш открывалось диалоговое окно &quot;Открыть&quot;? Для одной клавиши...

Горячие клавиши
Здраствуйте уважаемые программисты! У меня просьба, я вылаживаю исходники небольшой программки (делал не я) и хочу чтобы вы сделали в...

Горячие клавиши
Вот такая проблемка. Нужно мне настроить горячие клавиши на &quot;Exit&quot; - esc, &quot;About&quot; - f1, &quot;Open&quot; - Ctrl+О. Не могу понять как это...


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

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

Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru