Taste abfragen ...in eine Schleife ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Taste abfragen ...in eine Schleife ?

Beitrag von funkheld »

Wie kann man in dieser Schleife am besten ein gedrückte Taste abfragen ?

Danke.

Gruss

Code: Alles auswählen

 Repeat
   Event = WaitWindowEvent()
  .......
  Until EventID = #PB_Event_CloseWindow
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Taste abfragen ...in eine Schleife ?

Beitrag von RSBasic »

Code: Alles auswählen

EnableExplicit

Define EventID

If OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  Repeat
    EventID=WaitWindowEvent()
    If GetAsyncKeyState_(#VK_A)
      Debug "Taste A wird gedrückt."
    EndIf
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Taste abfragen ...in eine Schleife ?

Beitrag von ts-soft »

GetAsyncKeystate hat IMHO nichts im EventLoop zu suchen, ist nicht Eventgesteuert!

Code: Alles auswählen

EnableExplicit

If OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow : Break
      Case #WM_KEYDOWN : Debug "Taste gedrückt"
      Case #WM_KEYUP : Debug "Taste losgelassen"
    EndSelect
  ForEver
EndIf 
oder ähnlich zu rsbasic seinen code:

Code: Alles auswählen

EnableExplicit

If OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow : Break
      Case #WM_KEYDOWN
        If EventwParam() = #VK_A
          Debug "A gedrückt"
        EndIf
    EndSelect
  ForEver
EndIf 
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Taste abfragen ...in eine Schleife ?

Beitrag von RSBasic »

Oder per Callback:

Code: Alles auswählen

Procedure.l WindowCallback(hWnd, uMsg, wParam, lParam)
  Result = #PB_ProcessPureBasicEvents
  
  If uMsg = #WM_KEYUP And wParam = #VK_A
    Debug "Taste A wurde gedrückt."
  EndIf
  
  ProcedureReturn Result
EndProcedure

If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  SetWindowCallback(@WindowCallback())
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Ist aber im Prinzip das gleiche wie 2. Beispielcode von ts-soft.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: Taste abfragen ...in eine Schleife ?

Beitrag von funkheld »

Jup, danke an alle.

Gruss
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Taste abfragen ...in eine Schleife ?

Beitrag von ts-soft »

Wenn man Windows-Messages verarbeitet, wo es kein Äquivalent in PB zu gibt, sollte man dies möglichst in einem
Windows-Callback tun, da im PB EventLoop nicht alle Messages ankommen. Was jetzt geht, kann in der nächsten
PB Version schon nicht mehr funktionieren.

Ausserdem können bestimmte Dinge im PB Eventloop nicht umgesetzt werden, z.B. die Rückgabewert festlegen.
Der Code von RSBasic sollte eine 0 zurückgeben, außerdem ist es keine Procedure.l :mrgreen:

Code: Alles auswählen

Procedure.i WindowCallback(hWnd, uMsg, wParam, lParam)
  Protected Result = #PB_ProcessPureBasicEvents
 
  If uMsg = #WM_KEYUP And wParam = #VK_A
    Debug "Taste A wurde gedrückt."
    ; Return = 0 oder
    ProcedureReturn 0
  EndIf
 
  ProcedureReturn Result
EndProcedure

If OpenWindow(0, 0, 0, 500, 250, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowCallback(@WindowCallback())
 
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf 
Euer Korinthenscheißerle :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten