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

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

19.09.2010, 16:50. Показов 3069. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.09.2010, 16:50
Ответы с готовыми решениями:

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

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

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

Горячие клавиши
Здравствуйте, как прикрепить горячие клавиши к Button. Например есть процедура: procedure...

5
873 / 544 / 117
Регистрация: 24.11.2009
Сообщений: 1,329
19.09.2010, 17:41 2
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
КотЪ
219 / 219 / 60
Регистрация: 26.05.2009
Сообщений: 688
20.09.2010, 12:33 3
Если глобальный хук не нужен (или такая комбинация уже захукана в Виндовс), то можно сделать невидимый пункт МейнМеню и поставить ему ShortCut. Но тут виды комбинаций ограничены.

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

Zabiyak Спасибо за совет, обязательно по-пытаюсь по-пробовать.
0
КотЪ
219 / 219 / 60
Регистрация: 26.05.2009
Сообщений: 688
20.09.2010, 18:06 5
Если же всё будет происходить программно, то вместо хоткея можно просто вызвать событие
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  [ТС] 6
Вопос решён на 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.10.2010, 10:00
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru