Seite 2 von 2

Re: ESC Taste gedrückt ?

Verfasst: 19.10.2024 17:22
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.

Re: ESC Taste gedrückt ?

Verfasst: 30.11.2024 21:29
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