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
Probleme mit der Shift-Taste bei KeyboardInKey
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
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.
Aber ich glaube nicht, dass das so schlimm ist, wenn man noch die Backspace Funktion implementiert
greetz
remi
Aber ich glaube nicht, dass das so schlimm ist, wenn man noch die Backspace Funktion implementiert
greetz
remi
- hardfalcon
- Beiträge: 3447
- Registriert: 29.08.2004 20:46
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!
....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 ........
Vielleicht hilft es ja weiter ..... Verbesserungsvorschläge erwünscht
Cu von Team100
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
Cu von Team100
Kompliziert kann es jeder lösen, aber das wirklich Geniale ist einfach.....