Probleme mit der Shift-Taste bei KeyboardInKey

Für allgemeine Fragen zur Programmierung mit PureBasic.
Hypersoft
Beiträge: 22
Registriert: 04.10.2004 16:14

Probleme mit der Shift-Taste bei KeyboardInKey

Beitrag von Hypersoft »

Hi,
Folgende EMail schrieb ich an den Purebasic-Support:

Sehr geehrter PureBasic-Support,
Ich habe den Befehl KeyboardInkey auf folgende Weise verwendet:

InitKeyboard
()

InitSprite
()

OpenWindow(nummer, 20, 20, 360, 300, #PB_Window_MinimizeGadget|#pb_window_maximizegadget, "Test")
OpenWindowedScreen(WindowID(nummer),20,20,360,300,1,0,0)
keypress$=""
Repeat
While keypress$=""
WindowEvent()
ExamineKeyboard()
keypress$ +KeyboardInkey()
Wend
text$ = text$+keypress$
keypress$ =""
p = p+1
Until p =50
MessageRequester("Test",text$)
End

Schreibt man etwas schneller, erkennt KeyboardInkey die Großschreibung nicht mehr. Muss ich bei diesem Befehl auf etwas bestimmtes achten?

Es währe sehr nett, wenn Sie mir helfen könnten!

MfG

Hypersoft

Der Support konnte mir darauf keine Antwort geben. "Bei mir lief Ihr kleines Programm einwandfrei" wurde mir mitgeteilt. Ich habe es jedoch schon auf mehreren Rechnern ausprobiert und überall passiert das gleiche. Schreibt man schnell, dann drückt man die Shift-Taste fast gleichzeitig mit dem Buchstaben. Dies erkennt der KeyboardInkey-Befehl aber dann nicht mehr. Ich brauche diese Funktion jedoch sehr dringend und möchte eigendlich auf die Win-API verzichten, da ich mich mit ihr überhaupt nicht auskenne. Für Hilfe währe ich sehr dankbar!
MfG
Hypersoft
netfreak
Beiträge: 91
Registriert: 23.10.2004 18:30
Kontaktdaten:

Beitrag von netfreak »

Hallo,
Also bei mir funktioniert der Code auch einfand frei auch wenn ich auf Shift drücke und schreibe! Jedoch wenn ich den Caps Lock (also immer Große schreibe ohne auf die Taste shift-Taste zu drücken) an mache erkennt er bei mir auch nicht die Großbuchstaben!
mfg
netfreak
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Hypersoft: Jep das Problem existiert bei mir auch. Aber ich fürchte du musst damit leben halt nicht so schnell zu schreiben. Das liegt wohl an DirectX, das die Shift-Taste nicht genug schnell erkennt. :roll:
Aber ich glaube nicht, dass das so schlimm ist, wenn man noch die Backspace Funktion implementiert :wink:

greetz
remi
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Ich fragemich schon lange, weshalb die Eingabegeräte nicht entweder nur von Windows verarbeitet werden, oder die Befehle in doppelter Ausführung, also einaml DX, einmal Windows, implementiert werden. denn warum muss ich, um das Keyboard abfragen zu können,ohne API zu benutzen, immer einen Screen öffnen? Das ist doch schwachsinn!
Team100
Beiträge: 104
Registriert: 13.09.2004 22:59

Beitrag von Team100 »

....das Problem hat mich interessiert und ich habe folgendes rausgefunden:

Nicht die Trägheit ist schuld an dem Problem, sondern die rasche Reaktion
der verwendeten Befehle. Beim schnellen Schreiben drückt man bei
Großbuchstaben die Shift-Taste und läßt sie unmittelbar vor dem Anschlag
des eigentlichen Zeichens los. Genau dann erscheint ein Kleinbuchstabe....

Zumindest ist das so auf meinem PC. Inwieweit das Hardware bzw.
Tastaturabhängig ist kann ich nicht sagen. Hier ein kleiner Code der
dem Drücken der Shift-Taste ein kleines Delay besorgt, weiters aber
bei lange gedrückter Shift-Taste das Delay wieder wegnimmt.... sonst
wird das nächste Zeichen nach dem Loslassen der Shift-Taste groß geschrieben.

Weil mich das Fehlen der Sonderzeichen sowie des großen ÖÄÜ
bei Anwendung von KeyboardInkey() gestört hat, habe ich gleich noch
einen kleinen Umsetzer für diese Zeichen in Abhängigkeit der Shift-Taste
eingebaut.

Nicht eingebaut ist eine Abfrage auf die Caps-Lock Funktion. Ich habe
einfach keinen vernünftigen Code für die laufende Abfrage des
Zustandes der Caps-Lock LED gefunden.

Übrigens kann man mit DrawText() sehr wohl Sonderzeichen schreiben
wenn man sie anliefert. Auch hierfür könnte die Procedure verwendet
werden, jedoch müßte man noch Backspace sowie das Durchrouten
von Steuerzeichen (Esc etc.) als zweiten Schritt realisieren. Doch dafür
ist jetzt keine Zeit ........

Code: Alles auswählen

#delaytime = 30
Dim shft(255)
shft(49) = 33 : shft(50) = 34 : shft(51) = 167 : shft(52) = 36 : shft(53) = 37 : shft(54) = 38
shft(55) = 47 : shft(56) = 40 : shft(57) = 41 : shft(48) = 61 : shft(44) = 59 : shft(46) = 58
shft(45) = 95 : shft(35) = 39 : shft(43) = 42 : shft(223) = 63: shft(60) = 62 : shft(246) = 214
shft(252) = 220 : shft(228) = 196

Procedure.s KeyboardInkey_Ex()
   
   ;15_02_2005 by  *** Team100 ***                    tested WinXP 
  
   ;; This procedure will catch the shift button for fast writing uppercase letters
   ;; in the same way as standard windows applications.
   ;; Second the program will force all additional shift letters (like !"§$%&/()....)
   ;; not supported by KeybordInkey()
   ;; Now you can write these letters even with DrawText() on your game screen.
   ;; Hint: Procedure does not support capslock function
   
   ;; uncomment next 2 lines if used outside a procedure
   ; Starttimer = 0  
   ; pushflag = 0     
   
   ;; Put next 6 lines uncommented to top of Your code
   ;; Set #delaytime to a value between 10 and 60 for smooth writing

   ; #delaytime = 30
   ; Dim shft(255)
   ; shft(49) = 33 : shft(50) = 34 : shft(51) = 167 : shft(52) = 36 : shft(53) = 37 : shft(54) = 38
   ; shft(55) = 47 : shft(56) = 40 : shft(57) = 41 : shft(48) = 61 : shft(44) = 59 : shft(46) = 58
   ; shft(45) = 95 : shft(35) = 39 : shft(43) = 42 : shft(223) = 63: shft(60) = 62 : shft(246) = 214
   ; shft(252) = 220 : shft(228) = 196 ; change values for other than non-german keyboards
   
   ;; Needs InitSprite() InitKeyboard() and Open[Windowed]Screen() on top of code
   
   
   Repeat
     ExamineKeyboard() 
     keypress$ = KeyboardInkey()
     
     If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift)
        If pushflag = - 1 : pushflag = 1 : EndIf
        If shft(Asc(keypress$)) > 0        
           keypress$ = Chr(shft(Asc(keypress$)))
        EndIf
     Else
        If pushflag = 0 : pushflag = -1 : EndIf 
        If pushflag = 1
           If Starttimer < #delaytime 
              If shft(Asc(keypress$)) = 0        
                 keypress$ = UCase(keypress$) 
              Else
                 keypress$ = Chr(shft(Asc(keypress$)))
              EndIf
              Starttimer + 1
           Else 
              Starttimer = 0      
              pushflag = 0
           EndIf
        EndIf
     EndIf
   Delay(1)
   Until keypress$ <> ""
ProcedureReturn = keypress$
EndProcedure

;TESTMain ####################################################################################

InitSprite () 
InitKeyboard () 
OpenWindow(nummer, 20, 20, 360, 300, #PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget, "Test") 
OpenWindowedScreen(WindowID(nummer),20,20,360,300,1,0,0) 

Repeat 
  text$ = text$ + KeyboardInkey_Ex() 
Debug text$
  p = p + 1 
Until p = 50 
MessageRequester("Test",text$) 
End
Vielleicht hilft es ja weiter ..... Verbesserungsvorschläge erwünscht :)

Cu von Team100
Kompliziert kann es jeder lösen, aber das wirklich Geniale ist einfach.....
Antworten