ESC Taste gedrückt ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: ESC Taste gedrückt ?

Beitrag von H.Brill »

Mein Vorschlag : Vergiß einfach die ganzen Postfixe wie $ bei PB. Klar, es gibt sie bei manchen
Basicsprachen auch heute noch. War halt dafür gedacht, daß man z.b. am $ am Ende des Funktionsnamens
erkennen konnte, daß die Funktion einen String zurück gibt. Ich verwende das $ auch nicht bei selber
geschriebenen Funktionen. Nur noch die Hexzahlen bekommen eines als Prafix.
PB 6.10
Jens-Arne
Beiträge: 3
Registriert: 26.02.2022 14:49

Re: ESC Taste gedrückt ?

Beitrag von Jens-Arne »

Hallo Franz54,

wenn es sich nicht um ein Konsolenprogramm handelt, würde ich folgende Prozedur empfehlen, die ich mir dafür gebaut habe (funktioniert nur mit Windows, da die Windows-API benutzt wird):

Code: Alles auswählen

Procedure IsKey(vk.l,Alternator.b=0,hForegroundWindow.i=0) ;Alternator: 0=nichts, 1=Shift, 2=Ctrl, 4=Alt, 8=AltGR (kann mit "|" kombiniert werden; 8 muss für sich allein stehen); hForegroundWindow: WindowID des Fensters, das aktiv sein muss, damit der Tastendruck als gültig angesehen wird
  protected Ergebnis.b=0,*KeyboardState,Shift.b=1,Ctrl.b=1,Alt.b=1,AltGr.b=1,fgw.b=1,korrekt.b=1
  *KeyboardState=AllocateMemory(256)
  GetKeyboardState_(*KeyboardState) ;128=Taste gedrückt, 0=Taste nicht gedrückt
  if Alternator<>0 ;dient der Codebeschleunigung (wenn kein Alternator, keine Prüfungen)
    if ((Alternator & 1)=1) and ((PeekB(*KeyboardState+#VK_SHIFT) & 128)<>128)
      Shift=0
    endif
    if ((Alternator & 2)=2) and ((PeekB(*KeyboardState+#VK_CONTROL) & 128)<>128) or ((PeekB(*KeyboardState+#VK_RMENU) & 128)=128)
      Ctrl=0
    endif
    if ((Alternator & 4)=4) and ((PeekB(*KeyboardState+#VK_MENU) & 128)<>128) or ((PeekB(*KeyboardState+#VK_RMENU) & 128)=128) ;Menu=Alt
      Alt=0
    endif
    if ((Alternator & 8)=8) and ((PeekB(*KeyboardState+#VK_RMENU) & 128)<>128) ;RMenu=AltGr
      AltGr=0
    endif
  endif
  if hForegroundWindow<>0
    if GetForegroundWindow_()<>hForegroundWindow
      fgw=0
    endif
  endif
  if (Shift=korrekt) and (Ctrl=korrekt) and (Alt=korrekt) and (AltGr=korrekt) and (fgw=korrekt) and ((PeekB(*KeyboardState+vk) & 128)=128)
    Ergebnis=1
    WindowEvent() ;sonst wird der Tastendruck nicht zurückgesetzt, wenn die Taste losgelassen wird
  endif
  FreeMemory(*KeyboardState)
  ProcedureReturn Ergebnis
EndProcedure ;IsKey
Dann kannst Du im Hauptprogramm wie folgt abfragen:

Code: Alles auswählen

if IsKey(27)
  while IsKey(27)
    delay(25) ;so lange warten, bis Escape nicht mehr gedrückt wird, damit andere Programme, die ebenfalls hierauf reagieren, nicht auch geschlossen werden
  wend
  ;Programm beenden, Dialog schließen, was auch immer
endif
Damit kann man beliebige Tasten abfragen, auch kombiniert mit Shift, Ctrl, Alt und AltGr. Auch so seltsame Sache wie: IsKey(#VK_SHIFT,2) - das fragt Shift zusammen mit Ctrl ab, ohne irgendeine andere Taste.

Gruß, Jens-Arne
Antworten