Seite 1 von 1
knackigr Code zur Tastaturabfrage ohne Fenster für jede Tast
Verfasst: 31.07.2015 21:03
von 3dhubiflieger
Nach langem Suchen eines Codes, welcher Fensterunabhängig (kein Eventhandling), knackig und vor allem wirklich alle Tasten ohne irgendwelche if then Abfragen intentifiziert, habe ich mir diesen Code unten gestrickt. Ich dachte mir, ich stells mal rein.
Kanns jemand gebrauchen ? Was haltet ihr davon ?
Code: Alles auswählen
Macro GetBit(value,bit)
(value>>bit&1)
EndMacro
Procedure.s gedrueckteTaste()
For X = 0 To 255
If getbit(GetKeyState_(X),7)
KName$ = Space(255)
GetKeyNameText_(MapVirtualKey_(X,0)*$10000,KName$,255)
ProcedureReturn KName$
EndIf
Next
EndProcedure
Repeat
Delay(100)
Taste.s = gedrueckteTaste()
If Taste
Debug Taste
EndIf
ForEver
Re: knackigr Code zur Tastaturabfrage ohne Fenster für jede
Verfasst: 31.07.2015 23:25
von Derren
Also ich seh 256 If-Abfragen
Abgesehen davon dass Delay 100 viel zu groß ist. Da wird beim schnellen Tippen einiges verschluckt
Re: knackigr Code zur Tastaturabfrage ohne Fenster für jede
Verfasst: 01.08.2015 07:43
von 3dhubiflieger
Hatte jetzt irgendwie nen Problem mit meiner Prozedur. Wenn ein Programm in einer Eventschleife ist und anschliessend einen Event abfragt (z.b Gadgets) und anschliessend meine
Prozedur aufruft, erscheint kein Zeichen ?! Wenn ich allerdings so wie jetzt Windowevent() ein-
füge, geht es ? Weiss jemand warum das so ist ? Hab jedenfalls mal das Makro noch mit ausgenommen.
@Derren..klar die Schleife läuft 256 If thens durch....Aber das ist was anderes, als wenn
ich jede Konstante nicht in einer Schleife sondern Zeile für Zeile abfrage bzw schreiben muss.
Vielleicht modifiziere ich es mit Getkeyboardstate. Aber ich bin eigentlich so zufrieden.
Das mit dem Delay..kann man ja modifizieren..Is ja nun nicht wirklich ein Problem !
Code: Alles auswählen
Procedure.s gedrueckteTaste()
For i = 0 To 255
; WindowEvent()
If GetKeyState_(i) >>7 & 1
Name$ = Space(255)
GetKeyNameText_(MapVirtualKey_(i,0)*$10000,Name$,255)
ProcedureReturn Name$
EndIf
Next
EndProcedure
repeat
delay(50)
debug gedrueckteTaste()
forever
Re: knackigr Code zur Tastaturabfrage ohne Fenster für jede
Verfasst: 07.08.2015 06:42
von STARGÅTE
3dhubiflieger hat geschrieben:Hatte jetzt irgendwie nen Problem mit meiner Prozedur. Wenn ein Programm in einer Eventschleife ist und anschliessend einen Event abfragt (z.b Gadgets) und anschliessend meine
Prozedur aufruft, erscheint kein Zeichen ?! Wenn ich allerdings so wie jetzt Windowevent() ein-
füge, geht es ? Weiss jemand warum das so ist ? Hab jedenfalls mal das Makro noch mit ausgenommen.
Das liegt an der Funktion
GetKeyState die du verwendest:
The key status returned from this function changes as a thread reads key messages from its message queue. The status does not reflect the interrupt-level state associated with the hardware. Use the GetAsyncKeyState function to retrieve that information.
Wenn also jemand anderes den Status abfragt, bekommt ihn deine Prozedur nicht mehr. Alternativen dazu findest du in der Hilfe oder im Forum
Re: knackigr Code zur Tastaturabfrage ohne Fenster für jede
Verfasst: 14.08.2015 06:29
von 3dhubiflieger
@Stargate : Danke für die Info

!
Ich habe jetzt mal meinen Code umgefriemelt und mit Getasynckeystate das ganze bewerkstelligt, da dies nicht von anderen Programmen abhängig ist.
Allerdings muss ich hier Getasynckeystate 2 mal aufrufen, da ja noch Zeichen von nem anderen Programm mit ankommen können. Im Moment arbeite ich übrigens daran, die Zeichen von einem Infrarotprogramm auszuwerten. Das heisst man drückt eine Taste auf der Infrarrotfernbedienung, der Treiber schreibt es in den Keyboardbuffer, und mein Programm wertet das aus. Da bei Infrarotfernbedienungen oft eine Pause zwischen dem senden drin ist, hab ich das in einer Prozedur gelöst..Schauts euch mal an...Kann man das dann so lassen ?
Is bissl tricky programmiert...
Code: Alles auswählen
EnableExplicit
Procedure.s gedrueckteKeyboardTaste()
Define X, KName$
;Taste abfragen
For X = 0 To 255
;alten Wert löschen (sonst werden die zuvor gedrückten Tasten angezeigt !)
GetAsyncKeyState_(X)
;Key auswerten
If GetAsyncKeyState_(X)
KName$ = Space(255)
GetKeyNameText_(MapVirtualKey_(X,0)*$10000,KName$,255)
ProcedureReturn KName$
EndIf
Next
EndProcedure
Global Startz ,Keygedrueckt.s
Procedure.s gedrueckteTasteMitSchwelle(OKSchwelle)
Define Key.s, vergZeit
Key = gedrueckteKeyboardTaste()
If Key
Keygedrueckt = Key
Startz = ElapsedMilliseconds()
ElseIf Startz
vergZeit = ElapsedMilliseconds() - Startz
EndIf
;Schwelle bis wann der Tastendruck noch als gedrueckt gehalten erkannt wird
If (vergZeit And vergZeit <= OKSchwelle) Or Key
ProcedureReturn keygedrueckt
Else
Keygedrueckt = ""
EndIf
EndProcedure
Repeat
Delay(50)
Debug gedrueckteTasteMitSchwelle(1000)
ForEver