{{DISPLAYTITLE:_KEYHIT}}
The [[_KEYHIT]] function returns [[ASCII]] one and two byte, OpenGL Virtual Key and Unicode keyboard key press codes.


{{PageSyntax}}
:{{Parameter|keycode&amp;}} = [[_KEYHIT]]


{{PageDescription}}
* Return values range up to &amp;H40000000 so use a [[LONG]] or [[_INTEGER64]] variable type. See the [[_KEYDOWN]] code list:
:* 0-255: [[ASCII]] values (Refer to [http://en.wikipedia.org/wiki/Code_page_437 CP437]).
:* 256-65535: [[ASCII#Two_Byte_Codes|2-byte]] character codes : code = [[CVI]]([[CHR$]](0) + [[CHR$]](scancode)) (unaffected by SHIFT/ALT/CTRL modifiers).
:* 65536-&amp;H40000000: [[_KEYDOWN|QB64-specific Virtual Key codes]] (designated with + for 100000 on keyboard below)
:* '''Negative''' [[LONG]] values returned indicate that a key was released or a lock function key has been turned off.
* '''Note: _KEYHIT can only return one value at a time so use the [[_KEYDOWN]] keyhit value to find key combinations.'''
* To receive input from a [[$CONSOLE]] window, use [[_CINP]].

{{WhiteStart}}'                                '''_KEYHIT Keyboard Codes'''
'
''''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&amp;  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   ,&lt;  .>  /?    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 '''
{{WhiteEnd}}
{{small|NOTE: The above commented table can be copied and pasted directly into the QB64 IDE}}
 
 
:* >= &amp;H40000000: [[Unicode]].

* An '''important difference''' between [[INKEY$]] and _KEYHIT is how they work when '''CTRL, ALT''' or '''SHIFT''' are used. INKEY$ returns a different code if you hold down CTRL, ALT or SHIFT before pressing  F1 (for example). _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 an Alt Gr key note:''' _KEYHIT may return both Alt (100307) and Ctrl (100306) codes when AltGr key is pressed or released.


{{PageExamples}}
''Example:'' This routine will return the codes for any keyboard presses.
{{CodeStart}}
 '' ''
{{Cl|DEFLNG}} A-Z
{{Cl|SCREEN (statement)|SCREEN}} {{Cl|_NEWIMAGE}}(800, 600, 8)
{{Cl|CLS}} , 1
font = {{Cl|_LOADFONT}}("cyberbit.ttf", 24)
unifont = {{Cl|_LOADFONT}}("cyberbit.ttf", 24, "UNICODE")
{{Cl|_FONT}} font

{{Cl|DO}}
  x = {{Cl|_KEYHIT}}
  {{Cl|IF}} x {{Cl|THEN}}
    {{Cl|IF}} x &lt; 0 {{Cl|THEN}}  'negative value means key released
      {{Cl|COLOR}} 2
      {{Cl|PRINT}} "Released ";
      x = -x
    {{Cl|ELSE}}
      {{Cl|COLOR}} 10
      {{Cl|PRINT}} "Pressed ";   'positive value means key pressed
    {{Cl|END IF}}
    {{Cl|IF}} x &lt; 256 {{Cl|THEN}}    'ASCII code values
      {{Cl|PRINT}} "{{Cl|ASC}}II "; x;
      {{Cl|IF}} x >= 32 {{Cl|AND (boolean)|AND}} x &lt;= 255 {{Cl|THEN}} {{Cl|PRINT}} "[" + {{Cl|CHR$}}(x) + "]" {{Cl|ELSE}} {{Cl|PRINT}}
    {{Cl|END IF}}
    {{Cl|IF}} x >= 256 {{Cl|AND (boolean)|AND}} x &lt; 65536 {{Cl|THEN}} '2 byte key codes
      {{Cl|PRINT}} "2-BYTE-{{Cl|COM}}BO "; x {{Cl|AND (boolean)|AND}} 255; x \ 256;
      x2 = x \ 256
      {{Cl|IF}} x2 >= 32 {{Cl|AND (boolean)|AND}} x2 &lt;= 255 {{Cl|THEN}} {{Cl|PRINT}} "[" + {{Cl|CHR$}}(x2) + "]" {{Cl|ELSE}} {{Cl|PRINT}}
    {{Cl|END IF}}
    {{Cl|IF}} x >= 100000 {{Cl|AND (boolean)|AND}} x &lt; 200000 {{Cl|THEN}}      'QB84 Virtual Key codes
      {{Cl|PRINT}} "SDL VK"; x - 100000
      {{Cl|END IF}}
      {{Cl|IF}} x >= 200000 {{Cl|AND (boolean)|AND}} x &lt; {{Cl|&amp;H}}40000000 {{Cl|THEN}}
            {{Cl|PRINT}} "QB64 VK"; x - 200000
    {{Cl|END IF}}
    {{Cl|IF}} x >= {{Cl|&amp;H}}40000000 {{Cl|THEN}}              'Unicode values (IME Input mode)
      {{Cl|PRINT}} "UNICODE "; x - {{Cl|&amp;H}}40000000; "0x" + {{Cl|HEX$}}(x - {{Cl|&amp;H}}40000000) + " ...";
      cx = {{Cl|POS}}(1): cy = {{Cl|CSRLIN}}
      {{Cl|_FONT}} unifont
      {{Cl|LOCATE}} cy, cx
      {{Cl|COLOR}} 15
      z$ = {{Cl|MKL$}}(x - {{Cl|&amp;H}}40000000) + {{Cl|MKL$}}(0)
      {{Cl|PRINT}} z$ + z$ + z$;
      {{Cl|_FONT}} font
      {{Cl|LOCATE}} cy, 1: {{Cl|PRINT}}
    {{Cl|END IF}}
  {{Cl|END IF}}
{{Cl|LOOP}} '' ''
{{CodeEnd}}
{{small|Code by Galleon}}


{{PageSeeAlso}}
* [[_KEYDOWN]], [[_CINP]]
* [[_MAPUNICODE]], [[_MAPUNICODE (function)]] 
* [[INKEY$]], [[ASCII]] {{text|(code table)}}, 
* [[Unicode]], [[Code Pages]] {{text|(by region)}}
* [[INP]]([[&amp;H|&amp;H60]]), [[Scancodes]]
* [[ON KEY(n)]], [[KEY(n)]], [[KEY n]]
* [[Windows_Libraries#Hot_Keys_.28maximize.29|Windows hot keys]]


{{PageNavigation}}
