purebasic.info

PureBasic forum
Текущее время: Пн дек 17, 2018 10:42 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
СообщениеДобавлено: Ср апр 19, 2017 3:56 pm 
Не в сети
доцент

Зарегистрирован: Пн фев 24, 2014 1:13 pm
Сообщений: 25
Благодарил (а): 2 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
часто бывает нужно зарегистрировать глобальную горячую клавишу. также хочется как можно меньше писать всякие парсеры и т.п, особенно если есть какой-нибудь ini файл со следующим содержимым:
Код:
1
2
3
4
5
 
[command1]
point = 500,350
hotKey = ctrl+alt+f
 



нижеприведенная функция как раз работает со строковым описанием горячих клавишь. все названия клавишь можно посмотреть в KeyboardMap, а описание модификаторов в исходнике функции AddGlobalHotKey.
эти функции работают по принципу AddKeyboardShortcut и RemoveKeyboardShortcut, за исключением AddGlobalHotKey в которую горячая клавиша передается строковым представлением.
чтобы получить событие нажатой горячей клавиши, в главном цикле windowEvent() или WaitWindowEvent(), придет событие #WM_HOTKEY, Wparam содержит код события, получить его можно EventWparam() - разработчики пурика не рекомендуют использовать, но попрежнему эти функции не убраны, либо через регистрацию оконной процедуры и отслеживания там события #WM_HOTKEY и получение кода события из wparam.
Код:
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
 
  Global NewMap KeyboardMap.w()
    KeyboardMap("lbutton") = $01
KeyboardMap("rbutton") = $02
KeyboardMap("cancel") = $03
KeyboardMap("mbutton") = $04
KeyboardMap("xbutton1") = $05
KeyboardMap("xbutton2") = $06
KeyboardMap("back") = $08
KeyboardMap("tab") = $09
KeyboardMap("clear") = $0c
KeyboardMap("return") = $0d
KeyboardMap("pause") = $13
KeyboardMap("capital") = $14
KeyboardMap("kana") = $15
KeyboardMap("hangeul") = $15
KeyboardMap("hangul") = $15
KeyboardMap("junja") = $17
KeyboardMap("final") = $18
KeyboardMap("hanja") = $19
KeyboardMap("kanji") = $19
KeyboardMap("escape") = $1b
KeyboardMap("convert") = $1c
KeyboardMap("nonconvert") = $1d
KeyboardMap("accept") = $1e
KeyboardMap("modechange") = $1f
KeyboardMap("space") = $20
KeyboardMap("prior") = $21
KeyboardMap("next") = $22
KeyboardMap("end") = $23
KeyboardMap("home") = $24
KeyboardMap("left") = $25
KeyboardMap("up") = $26
KeyboardMap("right") = $27
KeyboardMap("down") = $28
KeyboardMap("select") = $29
KeyboardMap("print") = $2a
KeyboardMap("execute") = $2b
KeyboardMap("snapshot") = $2c
KeyboardMap("insert") = $2d
KeyboardMap("delete") = $2e
KeyboardMap("help") = $2f
KeyboardMap("0") = $30
KeyboardMap("1") = $31
KeyboardMap("2") = $32
KeyboardMap("3") = $33
KeyboardMap("4") = $34
KeyboardMap("5") = $35
KeyboardMap("6") = $36
KeyboardMap("7") = $37
KeyboardMap("8") = $38
KeyboardMap("9") = $39
KeyboardMap("a") = $41
KeyboardMap("b") = $42
KeyboardMap("c") = $43
KeyboardMap("d") = $44
KeyboardMap("e") = $45
KeyboardMap("f") = $46
KeyboardMap("g") = $47
KeyboardMap("h") = $48
KeyboardMap("i") = $49
KeyboardMap("j") = $4a
KeyboardMap("k") = $4b
KeyboardMap("l") = $4c
KeyboardMap("m") = $4d
KeyboardMap("n") = $4e
KeyboardMap("o") = $4f
KeyboardMap("p") = $50
KeyboardMap("q") = $51
KeyboardMap("r") = $52
KeyboardMap("s") = $53
KeyboardMap("t") = $54
KeyboardMap("u") = $55
KeyboardMap("v") = $56
KeyboardMap("w") = $57
KeyboardMap("x") = $58
KeyboardMap("y") = $59
KeyboardMap("z") = $5a
KeyboardMap("apps") = $5d
KeyboardMap("sleep") = $5f
KeyboardMap("numpad0") = $60
KeyboardMap("numpad1") = $61
KeyboardMap("numpad2") = $62
KeyboardMap("numpad3") = $63
KeyboardMap("numpad4") = $64
KeyboardMap("numpad5") = $65
KeyboardMap("numpad6") = $66
KeyboardMap("numpad7") = $67
KeyboardMap("numpad8") = $68
KeyboardMap("numpad9") = $69
KeyboardMap("multiply") = $6a
KeyboardMap("add") = $6b
KeyboardMap("separator") = $6c
KeyboardMap("subtract") = $6d
KeyboardMap("decimal") = $6e
KeyboardMap("divide") = $6f
KeyboardMap("f1") = $70
KeyboardMap("f2") = $71
KeyboardMap("f3") = $72
KeyboardMap("f4") = $73
KeyboardMap("f5") = $74
KeyboardMap("f6") = $75
KeyboardMap("f7") = $76
KeyboardMap("f8") = $77
KeyboardMap("f9") = $78
KeyboardMap("f10") = $79
KeyboardMap("f11") = $7a
KeyboardMap("f12") = $7b
KeyboardMap("f13") = $7c
KeyboardMap("f14") = $7d
KeyboardMap("f15") = $7e
KeyboardMap("f16") = $7f
KeyboardMap("f17") = $80
KeyboardMap("f18") = $81
KeyboardMap("f19") = $82
KeyboardMap("f20") = $83
KeyboardMap("f21") = $84
KeyboardMap("f22") = $85
KeyboardMap("f23") = $86
KeyboardMap("f24") = $87
KeyboardMap("numlock") = $90
KeyboardMap("scroll") = $91
KeyboardMap("oem_nec_equal") = $92
KeyboardMap("oem_fj_jisho") = $92
KeyboardMap("oem_fj_masshou") = $93
KeyboardMap("oem_fj_touroku") = $94
KeyboardMap("oem_fj_loya") = $95
KeyboardMap("oem_fj_roya") = $96
KeyboardMap("browser_back") = $a6
KeyboardMap("browser_forward") = $a7
KeyboardMap("browser_refresh") = $a8
KeyboardMap("browser_stop") = $a9
KeyboardMap("browser_search") = $aa
KeyboardMap("browser_favorites") = $ab
KeyboardMap("browser_home") = $ac
KeyboardMap("volume_mute") = $ad
KeyboardMap("volume_down") = $ae
KeyboardMap("volume_up") = $af
KeyboardMap("media_next_track") = $b0
KeyboardMap("media_prev_track") = $b1
KeyboardMap("media_stop") = $b2
KeyboardMap("media_play_pause") = $b3
KeyboardMap("launch_mail") = $b4
KeyboardMap("launch_media_select") = $b5
KeyboardMap("launch_app1") = $b6
KeyboardMap("launch_app2") = $b7
KeyboardMap("oem_1") = $ba
KeyboardMap("oem_plus") = $bb
KeyboardMap("oem_comma") = $bc
KeyboardMap("oem_minus") = $bd
KeyboardMap("oem_period") = $be
KeyboardMap("oem_2") = $bf
KeyboardMap("oem_3") = $c0
KeyboardMap("oem_4") = $db
KeyboardMap("oem_5") = $dc
KeyboardMap("oem_6") = $dd
KeyboardMap("oem_7") = $de
KeyboardMap("oem_8") = $df
KeyboardMap("oem_ax") = $e1
KeyboardMap("oem_102") = $e2
KeyboardMap("ico_help") = $e3
KeyboardMap("ico_00") = $e4
KeyboardMap("processkey") = $e5
KeyboardMap("ico_clear") = $e6
KeyboardMap("packet") = $e7
KeyboardMap("oem_reset") = $e9
KeyboardMap("oem_jump") = $ea
KeyboardMap("oem_pa1") = $eb
KeyboardMap("oem_pa2") = $ec
KeyboardMap("oem_pa3") = $ed
KeyboardMap("oem_wsctrl") = $ee
KeyboardMap("oem_cusel") = $ef
KeyboardMap("oem_attn") = $f0
KeyboardMap("oem_finish") = $f1
KeyboardMap("oem_copy") = $f2
KeyboardMap("oem_auto") = $f3
KeyboardMap("oem_enlw") = $f4
KeyboardMap("oem_backtab") = $f5
KeyboardMap("attn") = $f6
KeyboardMap("crsel") = $f7
KeyboardMap("exsel") = $f8
KeyboardMap("ereof") = $f9
KeyboardMap("play") = $fa
KeyboardMap("zoom") = $fb
KeyboardMap("noname") = $fc
KeyboardMap("pa1") = $fd
KeyboardMap("oem_clear") = $fe
 
Procedure AddGloBalHotKey(window.i,hotkey.s,Event.i)
 
Protected modifier = #NUL
Protected vkCode = #Null
    Protected key.s
For count = 1 To 5
    key = Trim(LCase(StringField(hotkey,count,"+")))
        If key = "":Break:EndIf
    If vkCode : ProcedureReturn #Null : EndIf
    Select key  
        Case "shift","shft"
      modifier | #MOD_SHIFT
    Case "control","ctrl"
            modifier | #MOD_CONTROL
    Case "windows","win"
      modifier | #MOD_WIN
    Case "alt"
    modifier | #MOD_ALT  
    Default
      If modifier
        Debug key
        If FindMapElement(KeyboardMap(),key)
                    vkCode = KeyboardMap(key)
                EndIf    
              Else
                ProcedureReturn #Null
              EndIf
    EndSelect  
    Next
   
    If modifier And vkCode
    If RegisterHotKey_(WindowID(window),Event,modifier,vkCode)  
      ProcedureReturn #True
      EndIf
    EndIf  
    EndProcedure
   
    Procedure.i ReMoveGlobalHotkey(window.i,event.i)
      ProcedureReturn UnregisterHotKey_(WindowID(window),Event)
    EndProcedure
   
    ; пример использования:
    OpenWindow(0,0,0,640,480,"test")
    AddGloBalHotKey(0,"ctrl+win+a",1)
    Repeat
      event = WaitWindowEvent()
      If Event = #WM_HOTKEY
                If EventwParam() = 1 ; разработчики пурика  не рекомендуют использовать eventWparam, а оконную процедуру, но функции пока не убраны
Debug "ok"
                  Beep_(300,300)
        EndIf
        EndIf
        If Event = #PB_Event_CloseWindow
        ReMoveGlobalHotkey(0,1)  
      Break  
      EndIf  
      ForEver
 



Вложения:
Keyboard.pb [6.85 KiB]
Скачиваний: 67
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт апр 20, 2017 12:16 am 
Не в сети
доцент

Зарегистрирован: Пн фев 24, 2014 1:13 pm
Сообщений: 25
Благодарил (а): 2 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
и да, не сказал, тут защита от дурака, клавиши без модификаторов (control, alt) и т.д, зарегистрировать будет нельзя, если понадобиться, уже сами для себя уберёте заглушку.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт апр 20, 2017 1:15 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 676
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
Не понял что то у меня при запуске в 5.31 тупо пустое окно,так и хочется спросить не вникая в код,а что за визуальное событие должно произойти при запуске примера? :roll:


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт апр 21, 2017 1:41 pm 
Не в сети
доцент

Зарегистрирован: Пн фев 24, 2014 1:13 pm
Сообщений: 25
Благодарил (а): 2 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Сергейчик писал(а):
Не понял что то у меня при запуске в 5.31 тупо пустое окно,так и хочется спросить не вникая в код,а что за визуальное событие должно произойти при запуске примера? :roll:


Извините, не описал.при нажатии горячки ctrl+win+a в любом окне, в отладчике вылезет надпись "ok", и гнустнное устройство скажет бип.
данный пример демонстрирует горячки, поэтому я не стал писать визуальных наворотов, чтоб не отходить от сути.
и всегда стараюсь писать примеры так, чтобы демонстрировать описываемые действия, а то бывает, дадут тебе пример с горячими клавишами, а там чуть не игрушка написана, и попробуй найди нужное в коде.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB