knackigr Code zur Tastaturabfrage ohne Fenster für jede Tast

Für allgemeine Fragen zur Programmierung mit PureBasic.
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

knackigr Code zur Tastaturabfrage ohne Fenster für jede Tast

Beitrag 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

Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: knackigr Code zur Tastaturabfrage ohne Fenster für jede

Beitrag 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
Signatur und so
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Re: knackigr Code zur Tastaturabfrage ohne Fenster für jede

Beitrag 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

Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7035
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: knackigr Code zur Tastaturabfrage ohne Fenster für jede

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Re: knackigr Code zur Tastaturabfrage ohne Fenster für jede

Beitrag 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

Antworten