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 ? :mrgreen:

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 :mrgreen:

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 :D !

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