mirror of
https://github.com/QB64Official/qb64.git
synced 2024-08-22 11:25:08 +00:00
175 lines
8.6 KiB
Markdown
175 lines
8.6 KiB
Markdown
|
The **_KEYDOWN** function returns whether modifying keys like CTRL, ALT, SHIFT, and any other keys are pressed.
|
||
|
|
||
|
## Syntax
|
||
|
|
||
|
> return% = **_KEYDOWN(***code&***)**
|
||
|
|
||
|
* The *return* value is -1 if a specified key is pressed or 0 if it was not pressed. It can be used to monitor key combinations.
|
||
|
* The POSITIVE [LONG](LONG) *code* value can be from any function key that needs to be monitored in a key press combination.
|
||
|
* Unicode references:
|
||
|
* 1) What is the glyph represented by that UNICODE value: [Unicode Format Info](http://www.fileformat.info/info/unicode/char/search.htm)
|
||
|
* 2) Which fonts support the characters I want to use: [Unicode Fonts](http://en.wikipedia.org/wiki/Unicode_typefaces#Comparison_of_fonts)
|
||
|
* 3) What was the format again?: [Unicode Formats](http://www.birds-eye.net/definition/u/unicode.shtml)
|
||
|
* A UTF32 value is usually(but by no means always!) the same as a UTF16 value just with the top 2 bytes set to 0.
|
||
|
* An important difference between [INKEY$](INKEY$) and [_KEYHIT](_KEYHIT) is how they work when **CTRL, ALT** or **SHIFT** are used. [INKEY$](INKEY$) returns a different code if you hold down CTRL, ALT or SHIFT before pressing F1 (for example). [_KEYHIT](_KEYHIT) will return the same code regardless of which modifiers were used but you can check _KEYDOWN to see which modifying keys are being used.
|
||
|
* **Keyboards with Alt Gr key:** [_KEYHIT](_KEYHIT) may return both Alt(100307) and Ctrl(100306) codes when key is pressed or released.
|
||
|
* **Linux with foreign keyboards:** [SHELL](SHELL) [_HIDE](_HIDE) "setxkbmap us" will setup a keyboard to read US [Scancodes](Scancodes).
|
||
|
|
||
|
```text
|
||
|
|
||
|
**The QB64 Virtual Key constant values used: **
|
||
|
|
||
|
**0-255**: [ASCII](ASCII) values (Refer to [http://en.wikipedia.org/wiki/Code_page_437 CP437])
|
||
|
|
||
|
**256-65535**: [ASCII](ASCII) character codes (unaffected by SHIFT/ALT/CTRL modifiers)
|
||
|
Use [CVI](CVI) to convert ASCII 2-byte codes to _KEYDOWN values.
|
||
|
|
||
|
' **_KEYDOWN Keyboard Values**
|
||
|
'
|
||
|
**'Esc F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 Sys ScL Pause**
|
||
|
' 27 15104 15360 15616 15872 16128 16384 16640 16896 17152 17408 34048 34304 +316 +302 +019
|
||
|
**'`~ 1! 2@ 3# 4$ 5% 6^ 7& 8* 9( 0) -_ =+ BkSp Ins Hme PUp NumL / * -**
|
||
|
'126 33 64 35 36 37 94 38 42 40 41 95 43 8 20992 18176 18688 +300 47 42 45
|
||
|
** 96 49 50 51 52 53 54 55 56 57 48 45 61*
|
||
|
**'Tab Q W E R T Y U I O P [{ ]} \| Del End PDn 7Hme 8/▲ 9PU + **
|
||
|
' 9 81 87 69 82 84 89 85 73 79 80 123 125 124 21248 20224 20736 18176 18432 18688 43
|
||
|
** 113 119 101 114 116 121 117 105 111 112 91 93 92 55 56 57 *
|
||
|
**'CapL A S D F G H J K L ;: '" Enter 4/◄- 5 6/-►
|
||
|
'+301 65 83 68 70 71 72 74 75 76 58 34 13 19200 19456 19712 **E**
|
||
|
** 97 115 100 102 103 104 106 107 108 59 39 52 53 54 * **n**
|
||
|
**'Shift Z X C V B N M ,< .> /? Shift ▲ 1End 2/▼ 3PD t**
|
||
|
'+304 90 88 67 86 66 78 77 60 62 63 +303 18432 20224 20480 20736 **e**
|
||
|
** 122 120 99 118 98 110 109 44 46 47 49 50 51 * **r**
|
||
|
**'Ctrl Win Alt Spacebar Alt Win Menu Ctrl ◄- ▼ -► 0Ins .Del **
|
||
|
'+306 +311 +308 32 +307 +312 +319 +305 19200 20480 19712 20992 21248 13
|
||
|
' * 48 46*
|
||
|
'
|
||
|
' ** Lower value = LCase/NumLock On __________________ + = add 100000 **
|
||
|
|
||
|
```
|
||
|
|
||
|
```text
|
||
|
|
||
|
**65536-&H40000000: QB64-specific Virtual Key codes:**
|
||
|
|
||
|
CONST KEY_PAUSE& = 100019
|
||
|
CONST KEY_NUMLOCK& = 100300
|
||
|
CONST KEY_CAPSLOCK& = 100301
|
||
|
CONST KEY_SCROLLOCK& = 100302
|
||
|
CONST KEY_RSHIFT& = 100303
|
||
|
CONST KEY_LSHIFT& = 100304
|
||
|
CONST KEY_RCTRL& = 100305
|
||
|
CONST KEY_LCTRL& = 100306
|
||
|
CONST KEY_RALT& = 100307
|
||
|
CONST KEY_LALT& = 100308
|
||
|
CONST KEY_RMETA& = 100309 'Left 'Apple' key (MacOSX)
|
||
|
CONST KEY_LMETA& = 100310 'Right 'Apple' key (MacOSX)
|
||
|
CONST KEY_LSUPER& = 100311 'Left "Windows" key
|
||
|
CONST KEY_RSUPER& = 100312 'Right "Windows"key
|
||
|
CONST KEY_MODE& = 100313 '"AltGr" key
|
||
|
CONST KEY_COMPOSE& = 100314
|
||
|
CONST KEY_HELP& = 100315
|
||
|
CONST KEY_PRINT& = 100316
|
||
|
CONST KEY_SYSREQ& = 100317
|
||
|
CONST KEY_BREAK& = 100318
|
||
|
CONST KEY_MENU& = 100319
|
||
|
CONST KEY_POWER& = 100320
|
||
|
CONST KEY_EURO& = 100321
|
||
|
CONST KEY_UNDO& = 100322
|
||
|
CONST KEY_KP0& = 100256
|
||
|
CONST KEY_KP1& = 100257
|
||
|
CONST KEY_KP2& = 100258
|
||
|
CONST KEY_KP3& = 100259
|
||
|
CONST KEY_KP4& = 100260
|
||
|
CONST KEY_KP5& = 100261
|
||
|
CONST KEY_KP6& = 100262
|
||
|
CONST KEY_KP7& = 100263
|
||
|
CONST KEY_KP8& = 100264
|
||
|
CONST KEY_KP9& = 100265
|
||
|
CONST KEY_KP_PERIOD& = 100266
|
||
|
CONST KEY_KP_DIVIDE& = 100267
|
||
|
CONST KEY_KP_MULTIPLY& = 100268
|
||
|
CONST KEY_KP_MINUS& = 100269
|
||
|
CONST KEY_KP_PLUS& = 100270
|
||
|
CONST KEY_KP_ENTER& = 100271
|
||
|
CONST KEY_KP_INSERT& = 200000
|
||
|
CONST KEY_KP_END& = 200001
|
||
|
CONST KEY_KP_DOWN& = 200002
|
||
|
CONST KEY_KP_PAGE_DOWN& = 200003
|
||
|
CONST KEY_KP_LEFT& = 200004
|
||
|
CONST KEY_KP_MIDDLE& = 200005
|
||
|
CONST KEY_KP_RIGHT& = 200006
|
||
|
CONST KEY_KP_HOME& = 200007
|
||
|
CONST KEY_KP_UP& = 200008
|
||
|
CONST KEY_KP_PAGE_UP& = 200009
|
||
|
CONST KEY_KP_DELETE& = 200010
|
||
|
CONST KEY_SCROLL_LOCK_MODE& = 200011
|
||
|
CONST KEY_INSERT_MODE& = 200012
|
||
|
|
||
|
**&H40000000 up**: [Unicode](Unicode) using the **cyberbit.ttf** font when available.
|
||
|
|
||
|
**Use [_KEYHIT](_KEYHIT) to find the key codes to be monitored by _KEYDOWN! **
|
||
|
|
||
|
|
||
|
```
|
||
|
|
||
|
Comparing the _KEYDOWN returns using [CONST](CONST) values with 2 byte [INKEY$](INKEY$) returns.
|
||
|
|
||
|
```vb
|
||
|
|
||
|
CONST RSHIFT& = 100303
|
||
|
CONST LSHIFT& = 100304
|
||
|
DO
|
||
|
x = _KEYHIT
|
||
|
IF x = CVI(CHR$(0) + CHR$(59)) THEN
|
||
|
IF _KEYDOWN(LSHIFT&) OR _KEYDOWN(RSHIFT&) THEN
|
||
|
PRINT "KEYHIT: SHIFT + F1"
|
||
|
ELSE
|
||
|
PRINT "KEYHIT: F1"
|
||
|
END IF
|
||
|
END IF
|
||
|
k$ = INKEY$ 'compare key press return values
|
||
|
IF k$ = CHR$(0) + CHR$(59) THEN PRINT "INKEY$: F1"
|
||
|
IF k$ = CHR$(0) + CHR$(84) THEN PRINT "INKEY$: SHIFT+F1"
|
||
|
LOOP UNTIL k$ = CHR$(27) 'escape key exit
|
||
|
|
||
|
```
|
||
|
|
||
|
How to calculate the _KEYDOWN codes of the 2 byte INKEY$ arrow key codes using [CVI](CVI).
|
||
|
|
||
|
```vb
|
||
|
|
||
|
SCREEN 12
|
||
|
|
||
|
x = 320: y = 240
|
||
|
col = _RGB(255, 0, 0)
|
||
|
radius = 20
|
||
|
|
||
|
DO
|
||
|
CLS
|
||
|
LOCATE 1, 1: PRINT "Use the arrow keys to move the circle."
|
||
|
CIRCLE (x, y), radius, col
|
||
|
PAINT (x, y), col
|
||
|
|
||
|
IF _KEYDOWN(CVI(CHR$(0) + "P")) THEN y = y + 1 '_KEYDOWN(20480)
|
||
|
IF _KEYDOWN(CVI(CHR$(0) + "H")) THEN y = y - 1 '_KEYDOWN(18432)
|
||
|
IF _KEYDOWN(CVI(CHR$(0) + "K")) THEN x = x - 1 '_KEYDOWN(19200)
|
||
|
IF _KEYDOWN(CVI(CHR$(0) + "M")) THEN x = x + 1 '_KEYDOWN(19712)
|
||
|
|
||
|
_DISPLAY
|
||
|
_LIMIT 100 'limit to 100 frames per second
|
||
|
LOOP
|
||
|
|
||
|
```
|
||
|
|
||
|
> *Explanation:* When [CVI](CVI) is used with a 2 byte code, the code of the first character(0) is added to the second character code which is multiplied by 256. In the example, code zero is added to the [ASCII](ASCII) code of "P" which is 80. CVI multiplies 80 * 256 = 20480.
|
||
|
|
||
|
## See Also
|
||
|
|
||
|
* [_KEYHIT](_KEYHIT), [Unicode](Unicode), [Code Pages](Code-Pages) (by region)
|
||
|
* [_MAPUNICODE](_MAPUNICODE), [_MAPUNICODE (function)](_MAPUNICODE-(function))
|
||
|
* [INKEY$](INKEY$), [ASCII](ASCII), [CVI](CVI)
|
||
|
* [INP](INP)(&H60), [Scancodes](Scancodes)
|
||
|
* [ON KEY(n)](ON-KEY(n)), [KEY(n)](KEY(n)), [KEY n](KEY-n)
|
||
|
* [Windows Libraries](Windows-Libraries)
|