HotKey
Author: Jare
Added: 12. tammikuuta 2016 kello 18.55
Edited: 13. tammikuuta 2016 kello 11.02
Category: Syötteet
Description
Helppo tapa toteuttaa näppäinkomentoja, kuten Ctrl + S.
- Yhdistelmässä voi olla yhdestä kolmeen näppäintä
- Ei palauta true esimerkiksi testille Ctrl + S, jos painetaan Ctrl + Shift + S, tai ylipäätään samaan aikaan mitä tahansa muuta nappia, joka ei ole osa testattavaa yhdistelmää
- Käsittää mm. molemmat ctrl-napit samaksi napiksi, eli ei ole väliä, syötätkö parametriksi cbKeyLControl vai cbKeyRControl, kumpikin pätee kumpaankin nappiin. Sama juttu entereillä, shifteillä, windows-napeilla ja ylärivin/numpadin numeroilla
- Alt ja Alt Gr käsitellään edellisestä poiketen erillisinä nappeina. Yhtäläisyys on helppo lisätä haluttaessa itse.
- Voidaan testata pohjassa pitämistä tai yhden kerran "hittiä" (palauttaa true kun kaikki yhdistelmän näppäimet ovat pohjassa, ja seuraavalla kutsukerralla palauttaa false, vaikka näppäimet olisivat vielä pohjassa)
Edit 13.1.2016: Lisäsin UpdateHotKey()-funktion (ja muokkasin HotKey()-funktiota updaten vaatimalla tavalla). Sitä tulee kutsua pääloopissa, jotta HotKey()-funktio toimisi. Tein tämän muutoksen, jotta HotKeytä voisi kutsua samalla näppäinyhdistelmällä useassa eri kohtaa ohjelmaa. Aiemmin kävi niin, että funktio toimi ensimmäisessä kohdassa, mutta seuraavassa se palautti aina false. HotKeyDown() toimii aina, vaikkei UpdateHotKey():tä kutsuttaisikaan koskaan, mutta HotKey() vaatii nyt aina updaten.
Code
Select all1 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 | Dim HotKey_Cache(255) As Byte
Dim HotKey_Alternative(255) As Byte
HotKey_Alternative(cbKeyLShift) = cbKeyRShift
HotKey_Alternative(cbKeyRShift) = cbKeyLShift
HotKey_Alternative(cbKeyLControl) = cbKeyRControl
HotKey_Alternative(cbKeyRControl) = cbKeyLControl
HotKey_Alternative(cbKeyLWin) = cbKeyRWin
HotKey_Alternative(cbKeyRWin) = cbKeyLWin
HotKey_Alternative(cbKeyReturn) = cbKeyEnter
HotKey_Alternative(cbKeyEnter) = cbKeyReturn
HotKey_Alternative(cbKey1) = cbKeyNum1
HotKey_Alternative(cbKey2) = cbKeyNum2
HotKey_Alternative(cbKey3) = cbKeyNum3
HotKey_Alternative(cbKey4) = cbKeyNum4
HotKey_Alternative(cbKey5) = cbKeyNum5
HotKey_Alternative(cbKey6) = cbKeyNum6
HotKey_Alternative(cbKey7) = cbKeyNum7
HotKey_Alternative(cbKey8) = cbKeyNum8
HotKey_Alternative(cbKey9) = cbKeyNum9
HotKey_Alternative(cbKeyNum1) = cbKey1
HotKey_Alternative(cbKeyNum2) = cbKey2
HotKey_Alternative(cbKeyNum3) = cbKey3
HotKey_Alternative(cbKeyNum4) = cbKey4
HotKey_Alternative(cbKeyNum5) = cbKey5
HotKey_Alternative(cbKeyNum6) = cbKey6
HotKey_Alternative(cbKeyNum7) = cbKey7
HotKey_Alternative(cbKeyNum8) = cbKey8
HotKey_Alternative(cbKeyNum9) = cbKey9
Function HotKeyDown(key1,key2=0,key3=0)
down1 = False
down2 = False
down3 = False
For scan = 1 To 255
If KeyDown(scan) Then
If scan = key1 Or scan = HotKey_Alternative(key1) Then
down1 = True
ElseIf scan = key2 Or scan = HotKey_Alternative(key2) Then
down2 = True
ElseIf scan = key3 Or scan = HotKey_Alternative(key3) Then
down3 = True
Else
//Another key is down than any of the specified three keys
//Return False even If other down keys would match, because we don't want for example HotKey(cbKeyLControl,cbKeyS)
//To Return True when cbKeyLControl, cbKeyLShift And cbKeyS are pressed.
Return False
EndIf
EndIf
Next scan
result = down1
If key2 > 0 Then result = result And down2
If key3 > 0 Then result = result And down3
Return result
EndFunction
Function HotKey(key1,key2=0,key3=0)
count_keys = 1 + (key2>0) + (key3>0)
If HotKeyDown(key1,key2,key3) Then
If count_keys = (HotKey_Cache(key1)=2 Or HotKey_Cache(HotKey_Alternative(key1))=2) + (HotKey_Cache(key2)=2 Or HotKey_Cache(HotKey_Alternative(key2))=2) + (HotKey_Cache(key3)=2 Or HotKey_Cache(HotKey_Alternative(key3))=2) Then
Return False
Else
HotKey_Cache(key1) = 1
HotKey_Cache(key2) = 1
HotKey_Cache(key3) = 1
HotKey_Cache(HotKey_Alternative(key1)) = 1
HotKey_Cache(HotKey_Alternative(key2)) = 1
HotKey_Cache(HotKey_Alternative(key3)) = 1
Return True
EndIf
Else
Return False
EndIf
EndFunction
Function UpdateHotKey()
For i = 1 To 255
If HotKey_Cache(i) Then HotKey_Cache(i) = 2
If Not KeyDown(i) Then HotKey_Cache(i) = 0
Next i
EndFunction
//Example program
Repeat
Text 0,0, "PRESS AN"+"D HOLD:"
Text 0,15, "ctrl + shift + s: "+HotKeyDown(cbKeyLControl,cbKeyLShift,cbKeyS)
Text 0,30, "ctrl + s: "+HotKeyDown(cbKeyLControl,cbKeyS)
Text 0,45, "s: "+HotKeyDown(cbKeyS)
Text 0,75, "HIT:"
Text 0,90, "ctrl + shift + s: "+HotKey(cbKeyLControl,cbKeyLShift,cbKeyS)
Text 0,105, "ctrl + s: "+HotKey(cbKeyLControl,cbKeyS)
Text 0,120, "s: "+HotKey(cbKeyS)
UpdateHotKey()
DrawScreen
Forever
|
Comments
No comments. You can be first!
Leave a comment
You must be logged in to comment.