Login Register
Frontpage Code library Pastebin

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 all
 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
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.