ich konnte es nicht lassen....
is bestimmt nicht die eleganteste lösung, und überarbeitenswert...
außerdem sinds längst nicht alle tasten, grad mit den sonderzeichen oder SHIFT muss man halt mal sehen wie man das dann löst...
mir war halt danach, das mal auszutesten.
ScreenKeyboard und echte Tastatur parallel.
"R" wird auch als RETURN angenommen, aber der RETURN-Key funzt.
witziger Weise wird der ENTER-Key (NumPad) als "-" registriert... k.a. wieso...
das kleine ScreenKeyboard:
Code: Alles auswählen
Dim KeyB.f(9,3)
Restore KeyCodes
For t=0 To 3
  For n=0 To 9
    Read a$
    KeyB(n,t) = Asc(a$)
  Next
Next
InitKeyboard()
InitSprite()
InitMouse()
OpenScreen(800,600,32,"keytest")
Repeat
  ExamineKeyboard()
  ExamineMouse()
  ClearScreen($100408)
  MX = MouseX() : MY = MouseY()
  I$="":IN$=""
    
  If KeyPres
    KeyPres -1
  Else
    I$ = KeyboardInkey()
  EndIf
  If KeyboardReleased(#PB_Key_Return)
      KeyPres = 5
      IN$ = "R"
      KX = 9
      KY = 2
  EndIf
  If I$
    KeyRow = 0
    KeyLine = 0
    Repeat
      If Asc(I$) = KeyB(KeyRow,KeyLine)
        KeyPres = 5
        IN$ = I$
        KX = KeyRow
        KY = KeyLine
      Else
        KeyRow +1
        If KeyRow = 10
          KeyRow = 0
          KeyLine +1
        EndIf
      EndIf
    Until KeyPres > 0 Or KeyLine = 4
  EndIf
If MouseButton(1)
  ButPres = 1
ElseIf ButPres = 1
  ButPres = 0
  If MX < 200 And XY < 80
    KeyPres = 5
    KX = MX/20 : KY = MY/20
    IN$ = Chr(KeyB(KX,KY))
  EndIf
EndIf
If KeyPres = 5
  If IN$ ="R"
    Show$=""
  Else
    Show$ + IN$
    If Len(Show$) > 40
      Show$ = Right(Show$,40)
    EndIf
  EndIf
EndIf
  StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    FrontColor($FF8000)
    Box(0,0,200,80,$804000)
    If KeyPres
      Box(20*KX,20*KY,20,20,$A05000)
    EndIf
    For n=0 To 9
      Line(n*20+1,0,0,80,$402000)
    Next
    For n=0 To 3
      Line(0,n*20+1,200,0,$402000)
    Next
    For n=0 To 10
      Line(n*20,0,0,80,$C06000)
    Next
    For n=0 To 4
      Line(0,n*20,200,0,$C06000)
    Next
    For t=0 To 3
      For n=0 To 9
      DrawText(5+20*n,3+20*t,Chr(KeyB(n,t)))
      Next
    Next
    Line(20,300,400,0,$0040FF)
    Line(20,320,400,0,$0040FF)
    DrawText(20,303,Show$)
    Line(MX,MY, 8,16,$0080C0)
    Line(MX,MY,16, 8,$0080C0)
    Line(MX,MY,24,24,$0080C0)
  StopDrawing()
  If KeyboardPushed(#PB_Key_Escape) : EXIT = 1 : EndIf
  FlipBuffers()
Until EXIT = 1
End
DataSection
KeyCodes:
Data.s "1","2","3","4","5","6","7","8","9","0"
Data.s "q","w","e","r","t","z","u","i","o","p"
Data.s "a","s","d","f","g","h","j","k","l","R"
Data.s "y","x","c","v","b","n","m",",",".","-"
have fun.
PS
ein paar erklärungen...
ButPres fungiert als Flag für den MouseButton, damit der beim Release registriert wird, das verhintert mehrfachzeichen.
KeyPres wird auf 5 gesetzt, nur bei 5 wird die Taste registriert,
aber KeyPres fungiert gleichzeitig als Counter, damit die Taste 5 Frames lang Highlighted wird.
der RETURN-Key wird extra interpretiert, weil anscheinend Sonderzeichen nicht (alle) von KeyboardInkey() angenommen werden.
Die Schleife Repeat/Until KeyPres > 0 Or KeyLine = 4 erschien mir eleganter, als BREAK in geschachtelten For/Next
@unix
ja, das ist eine screen-, keine window-lösung.
wenn du ne WIN-lösung suchst, bist du mit ExamineKeyboard() aufm falschen Dampfer... 
PPS:
kleine korrektur: rücksetzung der Row/Line-Variablen ergänzt und vorangestellt.
 
			
			
									
									Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.