purebasic.info
http://purebasic.info/phpBB3ex/

Регистрация глобальных горячих клавиш (только Windows)
http://purebasic.info/phpBB3ex/viewtopic.php?f=10&t=4703
Страница 1 из 1

Автор:  electrik [ Ср апр 19, 2017 3:56 pm ]
Заголовок сообщения:  Регистрация глобальных горячих клавиш (только Windows)

часто бывает нужно зарегистрировать глобальную горячую клавишу. также хочется как можно меньше писать всякие парсеры и т.п, особенно если есть какой-нибудь 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]
Скачиваний: 281

Автор:  electrik [ Чт апр 20, 2017 12:16 am ]
Заголовок сообщения:  Re: Регистрация глобальных горячих клавиш (только Windows)

и да, не сказал, тут защита от дурака, клавиши без модификаторов (control, alt) и т.д, зарегистрировать будет нельзя, если понадобиться, уже сами для себя уберёте заглушку.

Автор:  Сергейчик [ Чт апр 20, 2017 1:15 am ]
Заголовок сообщения:  Re: Регистрация глобальных горячих клавиш (только Windows)

Не понял что то у меня при запуске в 5.31 тупо пустое окно,так и хочется спросить не вникая в код,а что за визуальное событие должно произойти при запуске примера? :roll:

Автор:  electrik [ Пт апр 21, 2017 1:41 pm ]
Заголовок сообщения:  Re: Регистрация глобальных горячих клавиш (только Windows)

Сергейчик писал(а):
Не понял что то у меня при запуске в 5.31 тупо пустое окно,так и хочется спросить не вникая в код,а что за визуальное событие должно произойти при запуске примера? :roll:


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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/