Tastendruck simulieren im Openscreen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Tastendruck simulieren im Openscreen

Beitrag von dysti »

Hallo,
ich bekomme es einfach nicht hin, das er nach dem ersten drücken der Entertaste in der zweiten Repeat-Schleife bleibt.
Er zeigt den Text "Test2" kurz an und steigt dann aus, weil er immer noch die Entertaste im Tastaturspeicher hat.
Er sollte aber in der zweiten Repeat-Schleife hängen bleiben.
Wie kann ich den Tastendruck simulieren oder Tataturspeicher löschen?
Auf jeden Fall sollten beide Repeat-Schleifen nur mit der Entertaste verlassen werden.

Code: Alles auswählen

InitKeyboard()
InitSprite()
OpenScreen(800,600,32,"")
EnableGraphicalConsole(1)
Repeat
  ExamineKeyboard()
  L$ + KeyboardInkey()
  If KeyboardReleased(#PB_Key_Back) 
  L$ = Left(input$, Len(L$)-1)
  EndIf
  ClearScreen(RGB(7, 133, 248))
  StartDrawing(ScreenOutput())
  DrawText(70,120,"Test1")
  DrawText(70,150,L$ )
  StopDrawing()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Return)

keybd_event_(#PB_Key_Escape,0, 0, 0)

Repeat
  ExamineKeyboard()
  L$ + KeyboardInkey()
  If KeyboardReleased(#PB_Key_Back) 
  L$ = Left(input$, Len(L$)-1)
  EndIf
  ClearScreen(RGB(7, 133, 248))
  StartDrawing(ScreenOutput())
  DrawText(70,120,"Test2")
  DrawText(70,150,L$ )
  StopDrawing()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Return)

CloseScreen()
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Re: Tastendruck simulieren im Openscreen

Beitrag von Christian+ »

Du solltest KeyboardReleased(#PB_Key_Return) statt KeyboardPushed(#PB_Key_Return) in diesem Fall verwenden da dann die Schleife erst verlassen wird wenn die Return Taste wieder Losgelassen wird und nicht sofort wenn sie gedrückt wird denn wenn du sie schon beim Drücken verlässt hast du immer das Problem das die Taste in Schliefe zwei immer noch gedrückt sein kann weshalb diese auch verlassen wird.
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: Tastendruck simulieren im Openscreen

Beitrag von dysti »

Danke, das war die Lösung.
Edit:

Etwas zu vorschnell.
So z.B. überspringt es "Test3" und geht gleich zu "Test4"
Gibt es noch eine andere Lösung?

Code: Alles auswählen

InitKeyboard()
InitSprite()
OpenScreen(800,600,32,"")
EnableGraphicalConsole(1)
Repeat
  ExamineKeyboard()
  L$ + KeyboardInkey()
  If KeyboardReleased(#PB_Key_Back) 
  L$ = Left(input$, Len(L$)-1)
  EndIf
  ClearScreen(RGB(7, 133, 248))
  StartDrawing(ScreenOutput())
  DrawText(70,120,"Test1")
  DrawText(70,150,L$ )
  StopDrawing()
  FlipBuffers()
Until KeyboardReleased(#PB_Key_Return)

Repeat
  ExamineKeyboard()
  L$ + KeyboardInkey()
  If KeyboardReleased(#PB_Key_Back) 
  L$ = Left(input$, Len(L$)-1)
  EndIf
  ClearScreen(RGB(7, 133, 248))
  StartDrawing(ScreenOutput())
  DrawText(70,120,"Test2")
  DrawText(70,150,L$ )
  StopDrawing()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Return)

Repeat
  ExamineKeyboard()
  L$ + KeyboardInkey()
  If KeyboardReleased(#PB_Key_Back) 
  L$ = Left(input$, Len(L$)-1)
  EndIf
  ClearScreen(RGB(7, 133, 248))
  StartDrawing(ScreenOutput())
  DrawText(70,120,"Test3")
  DrawText(70,150,L$ )
  StopDrawing()
  FlipBuffers()
Until KeyboardReleased(#PB_Key_Return)

Repeat
  ExamineKeyboard()
  L$ + KeyboardInkey()
  If KeyboardReleased(#PB_Key_Back) 
  L$ = Left(input$, Len(L$)-1)
  EndIf
  ClearScreen(RGB(7, 133, 248))
  StartDrawing(ScreenOutput())
  DrawText(70,120,"Test4")
  DrawText(70,150,L$ )
  StopDrawing()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Return)

CloseScreen()
  
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: Tastendruck simulieren im Openscreen

Beitrag von dysti »

Ich weiß nicht ob das die ultimative Lösung ist, aber so funktioniert es:

Code: Alles auswählen

InitKeyboard()
InitSprite()
OpenScreen(800,600,32,"")
EnableGraphicalConsole(1)
Repeat
  ExamineKeyboard()
  L$ + KeyboardInkey()
  If KeyboardReleased(#PB_Key_Back) 
  L$ = Left(input$, Len(L$)-1)
  EndIf
  ClearScreen(RGB(7, 133, 248))
  StartDrawing(ScreenOutput())
  DrawText(70,120,"Test1")
  DrawText(70,150,L$ )
  StopDrawing()
  FlipBuffers()
  
If KeyboardReleased(#PB_Key_Return)
  Goto a2
EndIf 

Until KeyboardPushed(#PB_Key_Escape)

a2:
Repeat
  ExamineKeyboard()
  L$ + KeyboardInkey()
  If KeyboardReleased(#PB_Key_Back) 
  L$ = Left(input$, Len(L$)-1)
  EndIf
  ClearScreen(RGB(7, 133, 248))
  StartDrawing(ScreenOutput())
  DrawText(70,120,"Test2")
  DrawText(70,150,L$ )
  StopDrawing()
  FlipBuffers()
  
If KeyboardReleased(#PB_Key_Return)
  Goto a3
EndIf 

Until KeyboardPushed(#PB_Key_Escape)

a3:
Repeat
  ExamineKeyboard()
  L$ + KeyboardInkey()
  If KeyboardReleased(#PB_Key_Back) 
  L$ = Left(input$, Len(L$)-1)
  EndIf
  ClearScreen(RGB(7, 133, 248))
  StartDrawing(ScreenOutput())
  DrawText(70,120,"Test3")
  DrawText(70,150,L$ )
  StopDrawing()
  FlipBuffers()
  
If KeyboardReleased(#PB_Key_Return)
  Goto a4
EndIf 

Until KeyboardPushed(#PB_Key_Escape)

a4:
Repeat
  ExamineKeyboard()
  L$ + KeyboardInkey()
  If KeyboardReleased(#PB_Key_Back) 
  L$ = Left(input$, Len(L$)-1)
  EndIf
  ClearScreen(RGB(7, 133, 248))
  StartDrawing(ScreenOutput())
  DrawText(70,120,"Test4")
  DrawText(70,150,L$ )
  StopDrawing()
  FlipBuffers()
  
If KeyboardReleased(#PB_Key_Return)
  Break
EndIf 

Until KeyboardPushed(#PB_Key_Escape)

CloseScreen()
End
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Re: Tastendruck simulieren im Openscreen

Beitrag von Christian+ »

In deinem Code der Test 3 überspringt ist bei Test 2 noch ein KeyboardPushed(#PB_Key_Return) statt KeyboardReleased(#PB_Key_Return) drin genau wie bei Test 4. Da Test 2 deshalb beim Drücken von Return und Test 3 anschließend beim Loslassen auf den Tastendruck reagiert wird Test 3 übersprungen. Auch hier behebt also KeyboardReleased(#PB_Key_Return) das Problem und du kannst dir das unschöne Goto sparen.
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: Tastendruck simulieren im Openscreen

Beitrag von dysti »

....sehr komisch. Genauso wie du es beschrieben hast, habe ich es gemacht.
Funktionierte nicht.
Jetzt hatte ich den PC neu gestartet und das wieder so umgeändert wie du es beschrieben hast.
Nun funtz es. Mag verstehen wer will, ich verstehe es nicht.
Murphy´s Gesetze!
Nochmals Danke @Christian+ :bounce:
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Renovatio

Re: Tastendruck simulieren im Openscreen

Beitrag von Renovatio »

Ich programmiere es zur Zeit für ein Projekt so:

Ich habe eine Variable, als Beispiel: AktuellesRepeat = ErsteRepeatSchleife

Wenn man nun eine Taste drücken soll dann frage ich das hiermit ab: If KeyboardReleased(#PB_Key_IrgendeineTaste) ...

Sollte dann wirklich eine Taste gedrückt worden sein dann folgendes im kurzen (ungetestet und auf die schnelle):

RepeatBereich = 1
If KeyboardReleased(#PB_Key_Return)
RepeatBereich = 2
EndIf

Du kannst es auch einfach schon komplett vorbereiten, so in etwa:

RepeatBereich = 1
If RepeatBereich = 1 And KeyboardReleased(#PB_Key_Return)
RepeatBereich = 2
ElseIf RepeatBereich = 2 And KeyboardReleased(#PB_Key_Return)
RepeatBereich = 3
ElseIf RepeatBereich = 3 And KeyboardReleased(#PB_Key_Return)
...
EndIf

Wie Du es brauchst, also je nachdem wie viele Schleifen oder Bereiche Du gerade hast. ;)
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: Tastendruck simulieren im Openscreen

Beitrag von dysti »

Hallo @Renovatio,
danke für den Tip.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Antworten