The idea was to be able to substitute key = inkey with key = readKeyBoard()
In the demo clicking a character will add to a string called text.
The Enter key will erase the contents of text.
Any other 2 character keys will have their asc code displayed.
Exit the demo using the real keyboard esc key.
First run this to make the layout.bmp which is an image of the keyboard used by the demo.
Have edited it with the suggestions that dodicat makes in the next post.
Code: Select all
screenres 888,260,32
width 888\8,256\16
color rgb(0,0,0),rgb(255,0,255):cls
'============= CREATE ARROW BITMAPS ================
'dimension pointers to bitmaps
dim shared as any ptr arrows(0 to 3)
'create bitmaps
for k as integer = 0 to 3
arrows(k)=imagecreate(17,17)
next k
'draw arrows into bitmaps
dim as integer v 'read pixel value
for k as integer = 0 to 3
for j as integer = 0 to 16
for i as integer = 0 to 16
read v
if v = 1 then
pset arrows(k),(i,j),rgb(0,0,0)
else
pset arrows(k),(i,j),rgb(255,0,255)
end if
next i
next j
print
next k
DATA 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0
DATA 1,1,1,1,1,1,1,1,1,0,0,0,1,0,0,0,0
DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0
DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0
DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0
DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0
DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0
DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0
DATA 1,1,1,1,1,1,1,1,1,0,0,0,1,0,0,0,0
DATA 0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
DATA 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0
DATA 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0
DATA 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0
DATA 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0
DATA 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0
DATA 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0
DATA 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0
DATA 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0
DATA 1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1
DATA 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0
DATA 0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0
DATA 0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0
DATA 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0
DATA 0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0
DATA 0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0
DATA 0,0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,1
DATA 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
DATA 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
DATA 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
DATA 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
DATA 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
DATA 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
DATA 0,0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,1
DATA 0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0
DATA 0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0
DATA 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0
DATA 0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0
DATA 0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0
DATA 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0
DATA 1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1
DATA 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0
DATA 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0
DATA 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0
DATA 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0
DATA 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0
DATA 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0
DATA 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0
DATA 0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0
'=====================================================
type BUTTON
as integer x
as integer y
as integer w
as integer h
as string lblA
as string lblB
end type
sub drawButton(btn as BUTTON)
line (btn.x,btn.y)-(btn.x+btn.w,btn.y+btn.h),rgb(0,0,0),b
draw string (btn.x+4,btn.y+2),btn.lblB
draw string (btn.x+4,btn.y+20),btn.lblA
end sub
const btnCount = 101
dim shared as BUTTON btns(1 to btnCount)
for i as integer = 1 to btnCount
read btns(i).x
read btns(i).y
read btns(i).w
read btns(i).h
read btns(i).lblA
read btns(i).lblB
next i
for i as integer = 1 to btnCount
drawButton(btns(i))
next i
put (633+8,173+10),arrows(3),trans 'up arrow
put (768+8,98+16),arrows(3),trans
put (595+8,211+10),arrows(2),trans 'left arrow
put (729+8,136+16),arrows(2),trans
put (635+8,213+10),arrows(1),trans 'down arrow
put (768+8,174+16),arrows(1),trans
put (671+8,211+10),arrows(0),trans 'right arrow
put (806+8,136+16),arrows(0),trans
'draw vertical ENTER label
draw string (854,180),"E"
draw string (854,192),"N"
draw string (854,204),"T"
draw string (854,216),"E"
draw string (854,228),"R"
draw string (455,139),chr(34) 'double inverted comma
bsave "layout.bmp",0 'save as bitmap image
sleep
data 3,60,36,36, "`","~"
data 41,60,36,36, "1","!"
data 79,60,36,36, "2","@"
data 117,60,36,36, "3","#"
data 155,60,36,36, "4","$"
data 193,60,36,36, "5","%"
data 231,60,36,36, "6","^"
data 269,60,36,36, "7","&"
data 307,60,36,36, "8","*"
data 345,60,36,36, "9","("
data 383,60,36,36, "0",")"
data 421,60,36,36, "-","_"
data 459,60,36,36, "=","+"
data 497,60,71,36, "space","back"
data 3,98,55,36, "","tab"
data 60,98,36,36, "Q","q"
data 98,98,36,36, "W","w"
data 136,98,36,36, "E","e"
data 174,98,36,36, "R","r"
data 212,98,36,36, "T","t"
data 250,98,36,36, "Y","y"
data 288,98,36,36, "U","u"
data 326,98,36,36, "I","i"
data 364,98,36,36, "O","o"
data 402,98,36,36, "P","p"
data 440,98,36,36, "[","{"
data 478,98,36,36, "]","}"
data 516,98,52,36, "\","|"
data 3,136,67,36, "lock","caps"
data 72,136,36,36, "A","a"
data 110,136,36,36, "S","s"
data 148,136,36,36, "D","d"
data 186,136,36,36, "F","f"
data 224,136,36,36, "G","g"
data 262,136,36,36, "H","h"
data 300,136,36,36, "J","j"
data 338,136,36,36, "K","k"
data 376,136,36,36, "L","l"
data 414,136,36,36, ";",":"
data 452,136,36,36, "'",""
data 490,136,78,36, "Enter",""
data 3,174,92,36, "Shift",""
data 97,174,36,36, "Z","z"
data 135,174,36,36, "X","x"
data 173,174,36,36, "C","c"
data 211,174,36,36, "V","v"
data 249,174,36,36, "B","b"
data 287,174,36,36, "N","n"
data 325,174,36,36, "M","m"
data 363,174,36,36, ",","<"
data 401,174,36,36, ".",">"
data 439,174,36,36, "/","?"
data 477,174,91,36, "Shift",""
data 3,212,53,36, "Ctrl",""
data 58,212,49,36, "win",""
data 109,212,49,36, "Alt",""
data 160,212,202,36,"","" 'space bar
data 364,212,49,36,"Alt",""
data 415,212,49,36,"win",""
data 466,212,49,36,"",""
data 517,212,52,36,"Ctrl",""
data 2,2,36,36,"ESC",""
data 63,2,36,36,"F1",""
data 101,2,36,36,"F2",""
data 139,2,36,36,"F3",""
data 177,2,36,36,"F4",""
data 241,2,36,36,"F5",""
data 279,2,36,36,"F6",""
data 317,2,36,36,"F7",""
data 355,2,36,36,"F8",""
data 419,2,36,36,"F9",""
data 457,2,36,36,"F10",""
data 495,2,36,36,"F11",""
data 533,2,36,36,"F12",""
data 595,60,36,36,"Ins",""
data 633,60,36,36,"Home",""
data 671,60,36,36,"PgUp",""
data 595,98,36,36,"Del",""
data 633,98,36,36,"End",""
data 671,98,36,36,"PgDn",""
data 633,174,36,36,"",""
data 595,212,36,36,"",""
data 633,212,36,36,"",""
data 671,212,36,36,"",""
data 729,60,36,36,"Lock","Num"
data 767,60,36,36,"/",""
data 805,60,36,36,"*",""
data 843,60,36,36,"-",""
data 729,98,36,36,"Home","7"
data 767,98,36,36,"","8"
data 805,98,36,36,"Pgup","9"
data 843,98,36,74,"+",""
data 729,136,36,36,"","4"
data 767,136,36,36,"","5"
data 805,136,36,36,"","6"
data 729,174,36,36,"End","1"
data 767,174,36,36,"","2"
data 805,174,36,36,"PgDn","3"
data 843,174,36,74,"",""
data 729,212,74,36,"Ins","0"
data 805,212,36,36,"Del","."
And this is the demo.
Code: Select all
screenres 896,480,32
color rgb(0,0,0),rgb(255,255,255):cls
dim shared as any ptr layout
layout = imagecreate(890,260)
bload "layout.bmp",layout
dim shared as integer mx,my,mb
dim shared as integer capsLock,shiftKey,altKey,ctrlKey,numLock 'control keys
dim shared as string fChar
capsLock = 1
shiftKey = 1
altKey = 1
ctrlKey = 1
numLock = 1 'locks number keyboard to numbers only
type BUTTON
as integer x
as integer y
as integer w
as integer h
as integer ascVal
as integer shiftVal
as ulong c
end type
sub drawButton(btn as BUTTON)
line (btn.x,btn.y)-(btn.x+btn.w,btn.y+btn.h-1),btn.c,bf
end sub
const btnCount = 101
dim shared as BUTTON btns(1 to btnCount)
for i as integer = 1 to 11 'read control keys
read btns(i).x
read btns(i).y
read btns(i).w
read btns(i).h
btns(i).c = rgb(0,0,255)
next i
for i as integer = 12 to 63 'read standard keys
read btns(i).x
read btns(i).y
read btns(i).w
read btns(i).h
read btns(i).ascVal
read btns(i).shiftVal
btns(i).c = rgb(255,0,0)
next i
for i as integer = 64 to 75 'read function keys
read btns(i).x
read btns(i).y
read btns(i).w
read btns(i).h
read btns(i).ascVal
'read btns(i).shiftVal
btns(i).c = rgb(200,100,0)
next i
for i as integer = 76 to 85 'text control keys
read btns(i).x
read btns(i).y
read btns(i).w
read btns(i).h
read btns(i).ascVal
'read btns(i).shiftVal
btns(i).c = rgb(200,20,100)
next i
for i as integer = 86 to 90 'operators on number pad
read btns(i).x
read btns(i).y
read btns(i).w
read btns(i).h
read btns(i).ascVal
'read btns(i).shiftVal
btns(i).c = rgb(200,120,100)
next i
for i as integer = 91 to 101 'numbers and edit keys on number pad
read btns(i).x
read btns(i).y
read btns(i).w
read btns(i).h
read btns(i).ascVal
read btns(i).shiftVal
btns(i).c = rgb(100,120,200)
next i
for i as integer = 1 to 90
drawButton(btns(i))
next i
function readKeyBoard() as string
dim as string strKey = ""
getmouse mx,my,,mb
if mb = 1 then
for i as integer = 1 to 11 'any control button pressed?
if mx>btns(i).x and my>btns(i).y and mx<btns(i).x+btns(i).w and my<btns(i).y+btns(i).h then
if i = 1 then capsLock = -capsLock 'toggle caps lock
if capsLock = 1 then
btns(1).c = rgb(0,0,255)
else
btns(1).c = rgb(55,255,100)
end if
if i = 2 or i = 3 then shiftKey = -shiftKey
if shiftKey = 1 then
btns(2).c = rgb(0,0,255)
btns(3).c = rgb(0,0,255)
else
btns(2).c = rgb(55,255,100)
btns(3).c = rgb(55,255,100)
end if
if i = 4 or i = 5 then ctrlKey = -ctrlKey
if i = 6 or i = 7 then altKey = -altKey
if i = 11 then numLock = -numLock
if numLock = 1 then
btns(11).c = rgb(0,0,255)
else
btns(11).c = rgb(55,255,100)
end if
end if
next i
for i as integer = 12 to 63 'any standard key pressed?
if mx>btns(i).x and my>btns(i).y and mx<btns(i).x+btns(i).w and my<btns(i).y+btns(i).h then
if shiftKey = -1 then
strKey = chr(btns(i).shiftVal)
else
if (capsLock = -1) and ( ( chr(btns(i).shiftVal) >= "A" and chr(btns(i).shiftVal) <= "Z" ) or ( chr(btns(i).ascVal) >= "a" and chr(btns(i).ascVal) <= "z") ) then
strKey = chr(btns(i).shiftVal)
else
strKey = chr(btns(i).ascVal)
end if
end if
shiftKey = 1 'turn back off
btns(2).c = rgb(0,0,255)
btns(3).c = rgb(0,0,255)
end if
next i
for i as integer = 64 to 75 'any function keys pressed
if mx>btns(i).x and my>btns(i).y and mx<btns(i).x+btns(i).w and my<btns(i).y+btns(i).h then
strKey = chr(255) & chr(btns(i).ascVal)
end if
next i
for i as integer = 76 to 85 'text control keys
if mx>btns(i).x and my>btns(i).y and mx<btns(i).x+btns(i).w and my<btns(i).y+btns(i).h then
strKey = chr(255) & chr(btns(i).ascVal)
end if
next i
for i as integer = 86 to 90 'number keyboard operators
if mx>btns(i).x and my>btns(i).y and mx<btns(i).x+btns(i).w and my<btns(i).y+btns(i).h then
strKey = chr(btns(i).ascVal)
end if
next i
for i as integer = 91 to 101
if mx>btns(i).x and my>btns(i).y and mx<btns(i).x+btns(i).w and my<btns(i).y+btns(i).h then
if numLock = 1 then
strKey = chr(btns(i).shiftVal)
else
strKey = chr(255) & chr(btns(i).ascVal)
end if
end if
next i
while mb=1
getmouse mx,my,,mb
sleep 2
wend
end if
return strKey
end function
dim as string strKey
dim as string text
do
strKey = readKeyBoard()
if strKey<>"" then
if len(strKey)=2 then 'function key
fChar = right(strKey,1) 'show in display
else
if asc(strKey) = 8 then 'backspace
if len(text)> 0 then
text = left(text,len(text)-1)
end if
else
if asc(strKey)<>13 then
text = text & strKey
else
text = ""
end if
end if
end if
end if
screenlock
cls
for i as integer = 1 to btnCount
drawButton(btns(i)) 'color buttons
next i
put (0,0),layout,trans 'overlay button display
locate 35,2
print text
locate 40,2
print "fChar = ";fChar;" ";asc(fChar)
screenunlock
sleep 2
loop until multikey(&H01)
sleep
'control keys
data 3,136,67,36 'caps lock
data 477,174,91,36 'shift key
data 3,174,92,36 'shift key
data 3,212,53,36 'ctrl key
data 517,212,52,36 'ctrl key
data 109,212,49,36 'alt key
data 364,212,49,36 'alt key
'not used
data 58,212,49,36 'win key
data 415,212,49,36 'win key
data 466,212,49,36 'print
data 729,60,36,36 'number lock
'character keys
data 60,98,36,36, 113,81 'Q
data 98,98,36,36, 119,87 'W
data 136,98,36,36,101,69 'E
data 174,98,36,36,114,82 'R
data 212,98,36,36,116,84 'T
data 250,98,36,36,121,89 'Y
data 288,98,36,36,117,85 'U
data 326,98,36,36,105,73 'I
data 364,98,36,36,111,79 'O
data 402,98,36,36,112,8 'P
data 72,136,36,36, 97,65 'A
data 110,136,36,36, 115,83 'S
data 148,136,36,36, 100,68 'D
data 186,136,36,36, 102,70 'F
data 224,136,36,36, 103,71 'G
data 262,136,36,36, 104,72 'H
data 300,136,36,36, 106,74 'J
data 338,136,36,36, 107,75 'K
data 376,136,36,36, 108,76 'L
data 97,174,36,36, 122,90 'Z
data 135,174,36,36,120,88 'X
data 173,174,36,36,99,67 'C
data 211,174,36,36,118,86 'V
data 249,174,36,36,98,66 'B
data 287,174,36,36,110,78 'N
data 325,174,36,36,109,77 'M
data 3,60,36,36, 96,126 '~ `
data 41,60,36,36, 49,33 '1!
data 79,60,36,36, 50,64 '2@
data 117,60,36,36, 51,35 '3#
data 155,60,36,36, 52,36 '4$
data 193,60,36,36, 53,37 '5%
data 231,60,36,36, 54,94 '6^
data 269,60,36,36, 55,38 '7&
data 307,60,36,36, 56,42 '8*
data 345,60,36,36, 57,40 '9(
data 383,60,36,36, 48,41 '0)
data 421,60,36,36, 45,95 '-_
data 459,60,36,36, 61,43 '=+
data 497,60,71,36, 8,8 'back space
data 3,98,55,36, 9,9 'tab
data 440,98,36,36,91,123 '[{
data 478,98,36,36,93,125 ']}
data 516,98,52,36,92,124 '\|
data 414,136,36,36, 59,58 ';:
data 452,136,36,36, 39,34 '
data 490,136,78,36, 13,13 'ENTER KEY
data 363,174,36,36,44,60 ',<
data 401,174,36,36,46,62 '.>
data 439,174,36,36,47,63 '/?
data 160,212,202,36,32,32 'space bar
data 2,2,36,36,27,27 'esc
'function keys insert chr(255) at start
data 63,2,36,36,59 'F1
data 101,2,36,36,60 'F2
data 139,2,36,36,61 'F3
data 177,2,36,36,62 'F4
data 241,2,36,36,63 'F5
data 279,2,36,36,64 'F6
data 317,2,36,36,65 'F7
data 355,2,36,36,66 'F8
data 419,2,36,36,67 'F9
data 457,2,36,36,68 'F10
data 495,2,36,36,133 'F11
data 533,2,36,36,134 'F12
'all the same with or without shift active, there is alt and ctrl not implemented yet
'insert chr(255) as first character in a two character string
data 595,60,36,36,82 'Insert alt 162 ctrl 146
data 633,60,36,36,71 'Home alt 151 ctrl 119
data 671,60,36,36,73 'PgUp alt 153 ctrl 132
data 595,98,36,36,83 'Delete alt 163 ctrl 147
data 633,98,36,36,79 'End alt 159 ctrl 117
data 671,98,36,36,81 'PgDn alt 161 ctrl 118
data 633,174,36,36,72 'Up alt 152 ctrl 141
data 595,212,36,36,75 'Left alt 155 ctrl 115
data 633,212,36,36,80 'Down alt 160 ctrl 145
data 671,212,36,36,77 'Right alt 157 ctrl 116
'all the same with or without shift active
'Do not insert chr(255)!!
data 767,60,36,36,47 '/ DIVISION
data 805,60,36,36,42 '* MULTIPLICATION
data 843,60,36,36,45 '- SUBTRACTION
data 843,98,36,74,43 '+ ADDITION
data 843,174,36,74,13 'Enter... But does it end text entry or just number entry?
'number lock determines which value to return
'for the first value insert chr(255) in a two character string
data 729,98,36,36,71,55 'home and 7
data 767,98,36,36,72,56 'Up Arrow and 8
data 805,98,36,36,73,57 'Pgup and 9"
data 729,136,36,36,75,52 'Left Arrow and 4
data 767,136,36,36,76,53 'nothing and 5
data 805,136,36,36,77,54 'Right Arrow and 6
data 729,174,36,36,79,49 'End and 1
data 767,174,36,36,80,50 'Down Arrow and 2
data 805,174,36,36,81,51 'PgDn and 3"
data 729,212,74,36,82,48 'Insert and 0
data 805,212,36,36,83,46 'Del and decimal point
'