Seite 1 von 1

Probleme mit ExamineKeyboard

Verfasst: 23.11.2014 17:53
von Shamos
Hallo Gemeinde,
soeben hatte ich vor eine Prozedur auszuprobieren, um zu sehen ob diese
wie gewollt arbeitet und ob noch irgendwelche Fehler enthalten sind.
Dabei handelt es sich um die Prozedur.s KeyCombo() welche mir
als Rückgabewert einen String der Gleichzeitig gedrückten Tasten liefern soll.

Leider tritt bei der Ausführung des Programms ein (für mich) nicht begründeter
Fehler auf. Da es immer beim ersten Aufruf von ExamineKeyboard()
zu einem Fehler kommt, welcher mir mittels meiner funktionierenden
Fehler-Abfang-Funktion CatchERROR() mitgeteilt wird.

Daher stellt sich mir nun die Frage, worin hier das Problem liegt das ich bei Ausführung
des Programms die Debug-Message "CatchERROR: KeyCombo.ExamineKeyboard Erfolglos"
erhalte, obwohl die Tastatur erfolgreich initialisiert wurde?

Ebenso Anzumerken wie verwunderlich ist für mich,
weshalb der Beispiel-Code Keyboard.pb einwandfrei funktioniert,
mein kleiner Test-Code jedoch nicht. Es kann ja wohl kaum sein
wegen der Verwendung von EnableExplicit nicht lauffähig ist.

Code: Alles auswählen

EnableExplicit

;{ STRUCTURE'S
;}

;{ DEFINE'S 
;
Define b_exit_program		= #False
;
Define i_counter.i			= 0
Define i_num.i				 = 0
;
Define s_keycombo.s			= ""
;}

;{ PROCEDURE'S
;
;{ Fängt einen Fehler ab und Beendet das Programm mit einem Error-Requester und Exit Code 255
Procedure	CatchERROR(  i_ergebnis.i, s_text.s  )
	If i_ergebnis = 0
		Beep_(  3000, 100  )
		Beep_(  1000, 100  )
		Beep_(  2000, 100  )
		Debug(  "CatchERROR: "+s_text )
		MessageRequester(  "CatchERROR: ", s_text, #PB_MessageRequester_Ok  )
		Delay(3000)
		End 255
	EndIf
EndProcedure
;}

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; gibt eine tastenkombinationen als string zurück 
; Beispiel: [LCTRL][X]
; Beispiel: [LCTRL][RSHIFT][F3]
;
Procedure.s KeyCombo()
	
		Define s_returnstring.s	= ""
		
		;If IsScreenActive()
			CatchERROR(  ExamineKeyboard(), "KeyCombo.ExamineKeyboard Erfolglos"  )
		;EndIf



		If KeyboardPushed(  #PB_Key_LeftControl  )
			s_returnstring = s_returnstring + "[LCTRL]"
		EndIf
		If KeyboardPushed(  #PB_Key_LeftShift  )
			s_returnstring = s_returnstring + "[LSHIFT]"
		EndIf
		If KeyboardPushed(  #PB_Key_LeftAlt  )
			s_returnstring = s_returnstring + "[LALT]"
		EndIf
		If KeyboardPushed(  #PB_Key_RightControl  )
			s_returnstring = s_returnstring + "[RCTRL]"
		EndIf
		If KeyboardPushed(  #PB_Key_RightShift  )
			s_returnstring = s_returnstring + "[RSHIFT]"
		EndIf
		If KeyboardPushed(  #PB_Key_RightAlt  )
			s_returnstring = s_returnstring + "[RALT]"
		EndIf



		If KeyboardPushed(  #PB_Key_F1  )
			s_returnstring = s_returnstring + "[F1]"
		EndIf
		If KeyboardPushed(  #PB_Key_F2  )
			s_returnstring = s_returnstring + "[F2]"
		EndIf
		If KeyboardPushed(  #PB_Key_F3  )
			s_returnstring = s_returnstring + "[F3]"
		EndIf
		If KeyboardPushed(  #PB_Key_F4  )
			s_returnstring = s_returnstring + "[F4]"
		EndIf
		If KeyboardPushed(  #PB_Key_F5  )
			s_returnstring = s_returnstring + "[F5]"
		EndIf
		If KeyboardPushed(  #PB_Key_F6  )
			s_returnstring = s_returnstring + "[F6]"
		EndIf
		If KeyboardPushed(  #PB_Key_F7  )
			s_returnstring = s_returnstring + "[F7]"
		EndIf
		If KeyboardPushed(  #PB_Key_F8  )
			s_returnstring = s_returnstring + "[F8]"
		EndIf
		If KeyboardPushed(  #PB_Key_F9  )
			s_returnstring = s_returnstring + "[F9]"
		EndIf
		If KeyboardPushed(  #PB_Key_F10  )
			s_returnstring = s_returnstring + "[F10]"
		EndIf
		If KeyboardPushed(  #PB_Key_F11  )
			s_returnstring = s_returnstring + "[F11]"
		EndIf
		If KeyboardPushed(  #PB_Key_F12  )
			s_returnstring = s_returnstring + "[F12]"
		EndIf


		If KeyboardPushed(  #PB_Key_Scroll  )
			s_returnstring = s_returnstring + "[SCROLL]"
		EndIf
		If KeyboardPushed(  #PB_Key_Pause  )
			s_returnstring = s_returnstring + "[PAUSE]"
		EndIf
		If KeyboardPushed(  #PB_Key_Escape  )
			s_returnstring = s_returnstring + "[ESC]"
		EndIf
		If KeyboardPushed(  #PB_Key_Back  )
			s_returnstring = s_returnstring + "[BACK]"
		EndIf
		If KeyboardPushed(  #PB_Key_Tab  )
			s_returnstring = s_returnstring + "[TAB]"
		EndIf
		If KeyboardPushed(  #PB_Key_Return  )
			s_returnstring = s_returnstring + "[RETURN]"
		EndIf
		If KeyboardPushed(  #PB_Key_Space  )
			s_returnstring = s_returnstring + "[SPACE]"
		EndIf



		If KeyboardPushed(  #PB_Key_1  )
			s_returnstring = s_returnstring + "[1]"
		EndIf
		If KeyboardPushed(  #PB_Key_2  )
			s_returnstring = s_returnstring + "[2]"
		EndIf
		If KeyboardPushed(  #PB_Key_3  )
			s_returnstring = s_returnstring + "[3]"
		EndIf
		If KeyboardPushed(  #PB_Key_4  )
			s_returnstring = s_returnstring + "[4]"
		EndIf
		If KeyboardPushed(  #PB_Key_5  )
			s_returnstring = s_returnstring + "[5]"
		EndIf
		If KeyboardPushed(  #PB_Key_6  )
			s_returnstring = s_returnstring + "[6]"
		EndIf
		If KeyboardPushed(  #PB_Key_7  )
			s_returnstring = s_returnstring + "[7]"
		EndIf
		If KeyboardPushed(  #PB_Key_8  )
			s_returnstring = s_returnstring + "[8]"
		EndIf
		If KeyboardPushed(  #PB_Key_9  )
			s_returnstring = s_returnstring + "[9]"
		EndIf
		If KeyboardPushed(  #PB_Key_0  )
			s_returnstring = s_returnstring + "[0]"
		EndIf
		If KeyboardPushed(  #PB_Key_A  )
			s_returnstring = s_returnstring + "[A]"
		EndIf
		If KeyboardPushed(  #PB_Key_B  )
			s_returnstring = s_returnstring + "[B]"
		EndIf
		If KeyboardPushed(  #PB_Key_C  )
			s_returnstring = s_returnstring + "[C]"
		EndIf
		If KeyboardPushed(  #PB_Key_D  )
			s_returnstring = s_returnstring + "[D]"
		EndIf
		If KeyboardPushed(  #PB_Key_E  )
			s_returnstring = s_returnstring + "[E]"
		EndIf
		If KeyboardPushed(  #PB_Key_F  )
			s_returnstring = s_returnstring + "[F]"
		EndIf
		If KeyboardPushed(  #PB_Key_G  )
			s_returnstring = s_returnstring + "[G]"
		EndIf
		If KeyboardPushed(  #PB_Key_H  )
			s_returnstring = s_returnstring + "[H]"
		EndIf
		If KeyboardPushed(  #PB_Key_I  )
			s_returnstring = s_returnstring + "[I]"
		EndIf
		If KeyboardPushed(  #PB_Key_J  )
			s_returnstring = s_returnstring + "[J]"
		EndIf
		If KeyboardPushed(  #PB_Key_K  )
			s_returnstring = s_returnstring + "[K]"
		EndIf
		If KeyboardPushed(  #PB_Key_L  )
			s_returnstring = s_returnstring + "[L]"
		EndIf
		If KeyboardPushed(  #PB_Key_M  )
			s_returnstring = s_returnstring + "[M]"
		EndIf
		If KeyboardPushed(  #PB_Key_N  )
			s_returnstring = s_returnstring + "[N]"
		EndIf
		If KeyboardPushed(  #PB_Key_O  )
			s_returnstring = s_returnstring + "[O]"
		EndIf
		If KeyboardPushed(  #PB_Key_P  )
			s_returnstring = s_returnstring + "[P]"
		EndIf
		If KeyboardPushed(  #PB_Key_Q  )
			s_returnstring = s_returnstring + "[Q]"
		EndIf
		If KeyboardPushed(  #PB_Key_R  )
			s_returnstring = s_returnstring + "[R]"
		EndIf
		If KeyboardPushed(  #PB_Key_S  )
			s_returnstring = s_returnstring + "[S]"
		EndIf
		If KeyboardPushed(  #PB_Key_T  )
			s_returnstring = s_returnstring + "[T]"
		EndIf
		If KeyboardPushed(  #PB_Key_U  )
			s_returnstring = s_returnstring + "[U]"
		EndIf
		If KeyboardPushed(  #PB_Key_V  )
			s_returnstring = s_returnstring + "[V]"
		EndIf
		If KeyboardPushed(  #PB_Key_W  )
			s_returnstring = s_returnstring + "[W]"
		EndIf
		If KeyboardPushed(  #PB_Key_X  )
			s_returnstring = s_returnstring + "[X]"
		EndIf
		If KeyboardPushed(  #PB_Key_Y  )
			s_returnstring = s_returnstring + "[Y]"
		EndIf
		If KeyboardPushed(  #PB_Key_Z  )
			s_returnstring = s_returnstring + "[Z]"
		EndIf



		If KeyboardPushed(  #PB_Key_Minus  )
			s_returnstring = s_returnstring + "[MINUS]"
		EndIf
		If KeyboardPushed(  #PB_Key_Equals  )
			s_returnstring = s_returnstring + "[EQUALS]"
		EndIf
		If KeyboardPushed(  #PB_Key_LeftBracket  )
			s_returnstring = s_returnstring + "[LBRACKET]"
		EndIf
		If KeyboardPushed(  #PB_Key_RightBracket  )
			s_returnstring = s_returnstring + "[RBRACKET]"
		EndIf
		If KeyboardPushed(  #PB_Key_Apostrophe  )
			s_returnstring = s_returnstring + "[APOSTROPHE]"
		EndIf
		If KeyboardPushed(  #PB_Key_Grave  )
			s_returnstring = s_returnstring + "[GRAVE]"
		EndIf
		If KeyboardPushed(  #PB_Key_BackSlash  )
			s_returnstring = s_returnstring + "[BACKSLASH]"
		EndIf
		If KeyboardPushed(  #PB_Key_Comma  )
			s_returnstring = s_returnstring + "[COMMA]"
		EndIf
		If KeyboardPushed(  #PB_Key_SemiColon  )
			s_returnstring = s_returnstring + "[SEMICOLON]"
		EndIf
		If KeyboardPushed(  #PB_Key_Period  )
			s_returnstring = s_returnstring + "[PERIOD]"
		EndIf
		If KeyboardPushed(  #PB_Key_Slash  )
			s_returnstring = s_returnstring + "[SLASH]"
		EndIf
		If KeyboardPushed(  #PB_Key_Multiply  )
			s_returnstring = s_returnstring + "[MULTIPLY]"
		EndIf
		If KeyboardPushed(  #PB_Key_Capital  )
			s_returnstring = s_returnstring + "[CAPITAL]"
		EndIf



		If KeyboardPushed(  #PB_Key_NumLock  )
			s_returnstring = s_returnstring + "[NUMLOCK]"
		EndIf
		If KeyboardPushed(  #PB_Key_Pad0  )
			s_returnstring = s_returnstring + "[PAD0]"
		EndIf
		If KeyboardPushed(  #PB_Key_Pad1  )
			s_returnstring = s_returnstring + "[PAD1]"
		EndIf
		If KeyboardPushed(  #PB_Key_Pad2  )
			s_returnstring = s_returnstring + "[PAD2]"
		EndIf
		If KeyboardPushed(  #PB_Key_Pad3  )
			s_returnstring = s_returnstring + "[PAD3]"
		EndIf
		If KeyboardPushed(  #PB_Key_Pad4  )
			s_returnstring = s_returnstring + "[PAD4]"
		EndIf
		If KeyboardPushed(  #PB_Key_Pad5  )
			s_returnstring = s_returnstring + "[PAD5]"
		EndIf
		If KeyboardPushed(  #PB_Key_Pad6  )
			s_returnstring = s_returnstring + "[PAD6]"
		EndIf
		If KeyboardPushed(  #PB_Key_Pad7  )
			s_returnstring = s_returnstring + "[PAD7]"
		EndIf
		If KeyboardPushed(  #PB_Key_Pad8  )
			s_returnstring = s_returnstring + "[PAD8]"
		EndIf
		If KeyboardPushed(  #PB_Key_Pad9  )
			s_returnstring = s_returnstring + "[PAD9]"
		EndIf



		If KeyboardPushed(  #PB_Key_PadEnter  )
			s_returnstring = s_returnstring + "[PADENTER]"
		EndIf
		If KeyboardPushed(  #PB_Key_PadComma  )
			s_returnstring = s_returnstring + "[PADCOMMA]"
		EndIf
		If KeyboardPushed(  #PB_Key_Add  )
			s_returnstring = s_returnstring + "[PADADD]"
		EndIf
		If KeyboardPushed(  #PB_Key_Subtract  )
			s_returnstring = s_returnstring + "[PADSUBSTRACT]"
		EndIf
		If KeyboardPushed(  #PB_Key_Decimal  )
			s_returnstring = s_returnstring + "[PADDECIMAL]"
		EndIf
		If KeyboardPushed(  #PB_Key_Divide  )
			s_returnstring = s_returnstring + "[PADDIVIDE]"
		EndIf



		If KeyboardPushed(  #PB_Key_Insert  )
			s_returnstring = s_returnstring + "[INS]"
		EndIf
		If KeyboardPushed(  #PB_Key_Delete  )
			s_returnstring = s_returnstring + "[DEL]"
		EndIf
		If KeyboardPushed(  #PB_Key_Home  )
			s_returnstring = s_returnstring + "[POS1]"
		EndIf
		If KeyboardPushed(  #PB_Key_End  )
			s_returnstring = s_returnstring + "[ENDE]"
		EndIf
		If KeyboardPushed(  #PB_Key_PageUp  )
			s_returnstring = s_returnstring + "[PGUP]"
		EndIf
		If KeyboardPushed(  #PB_Key_PageDown  )
			s_returnstring = s_returnstring + "[PGDOWN]"
		EndIf



		If KeyboardPushed(  #PB_Key_Up  )
			s_returnstring = s_returnstring + "[CSRUP]"
		EndIf
		If KeyboardPushed(  #PB_Key_Down  )
			s_returnstring = s_returnstring + "[CSRDOWN]"
		EndIf
		If KeyboardPushed(  #PB_Key_Left  )
			s_returnstring = s_returnstring + "[CSRLEFT]"
		EndIf
		If KeyboardPushed(  #PB_Key_Right  )
			s_returnstring = s_returnstring + "[CSRRIGHT]"
		EndIf



	ProcedureReturn s_returnstring    

EndProcedure
;
;}



;{ MAIN_PROGRAM
;
	CatchError(   InitKeyboard(),	"InitKeyboard Erfolglos"  )
	CatchError(   InitSprite(),	"InitSprite Erfolglos" 	  )

	CatchError(   OpenWindow	(  0, 0, 0, 800, 600, "ICH BIN EIN FENSTER", #PB_Window_Minimize  ), 						  "OpenWindow Erfolglos"				)
	CatchError(   OpenWindowedScreen(  WindowID(0) , 10, 10, 100, 100, #False, 10, #PB_Screen_WaitSynchronization  ),	"OpenWindowedScreen Erfolglos"	 )
	

	s_keycombo = KeyCombo()
	
	Repeat
		Debug ( s_keycombo )
		Delay(1)
	ForEver
;
;}

Re: Probleme mit ExamineKeyboard

Verfasst: 23.11.2014 18:05
von STARGÅTE
Was ist das denn für ein komischer Code?
Da fehlt ja nahezu alles.
  • Wo ist dein Event-Loop für das geöffnete Window?
  • Wo ist deine aktualisierung des Screens (FlipBuffers)?
Desweiteren steht in der Hilfe das ExamineKeyboard() kein Rückgabewert hat, somit also u.u. auch 0 zurückgeben kann.

Re: Probleme mit ExamineKeyboard

Verfasst: 23.11.2014 18:42
von Shamos
Zuerst mal vielen Dank für deine Antwort Stargate,

der Code ist nicht komisch, sondern soll wie Eingangs schon erwähnt
lediglich dazu dienen meine keine Tastatenkomninations-Prozedur zu testen,
wobei jedoch ein Fehler auftrat, um den es mir dabei geht. Zudem ist dieser Code
wegen dieses Fehlers auch noch nicht fertig gestellt.

Wobei mir nun auffällt das es tatsächlich so ist das ExamineKeyboard keinen
Rückgabewert hat. :freak: :roll: Was dann offenbar auch das Problem des
ganzen war! :allright: Nun kann ich mit dem eigentlichen Schreiben meines
Test-Programmes weiter machen.

BTW, ich gelobe Besserung in Sachen Doku Lesen. :praise:

Re: Probleme mit ExamineKeyboard

Verfasst: 23.11.2014 18:49
von STARGÅTE
Warum "motzt" ExamineKeyboard() ?
Es ist nirgends definiert, was ExamineKeyboard() zurück gibt, wenn es erfolgreich war.
Nimm einfach diese Abfrage raus.
Und damit dein Fenster eine Rückmeldung bekommt muss auch ein WindowEvent() rein.
FlipBuffers() sollte ebenfalls rein, da dein Screen sonst einfriert, und da Keyboard auch über DirectX läuft könnte es da auch probleme geben.

Re: Probleme mit ExamineKeyboard

Verfasst: 23.11.2014 18:51
von Shamos
Siehe mein Nachtrag (oben wie auch hier), offenbar warst Du schneller mit
dem Antworten als ich mit dem Editieren meines Beitrags ;) :)

Ich musste einfach aus der Problem-Zeile ein
ExamineKeyboard()
machen und das Problem war erledigt^^


NACHTRAG:
Nachdem ich dann wie gesagt diese Problemzeile korregiert hatte und mein Hauptprogramm
wie nachfolgend umgeschrieben hatte, funktionierte das Test-Programm auch so wie von mir
ursprünglich beabsichtigt.

Code: Alles auswählen

;{ MAIN_PROGRAM
	;
	;	Eigentlich will ich in diesem Test-Programm bezüglich meiner Funktion KeyCombo
	;	gar keine Fenster öffnen. Was ich aber tun muss da ich vor Benutzung der
	;	Funktion ExamineKeyboard() die funktion OpenScreen() oder OpenWindowedScreen()
	;	aufrufen muss, da der Debugger sonst meckert
	;	--> [ERROR] OpenScreen() bzw. OpenWindowedScreen() muss aufgerufen werden, bevor andere Keyboard Befehle verwendet werden.
	;
	;	Was jedoch vorraussetzt das ich zuvor mittels OpenWindow() ein Fenster geöffnet
	;	haben muss, um OpenWindowedScreen() eine WindowID() mitteilen zu können.
	;	Dies wiederum setzt jedoch voraus das ich zuvor InitSprite() vor allen anderen
	;	Screen-Befehlen erfolgleich aufgerufen haben muss.
	;
	;	Aus diesem Grund bin ich also dazu genötigt Fenster/Screens zu öffnen obwohl
	;	Fenster für mein Verständnis an sich nichts mit einer Tastatureingabe zu tun haben.
	;

	CatchError(   InitKeyboard(),		"InitKeyboard Erfolglos"	)
	CatchError(   InitSprite(),		"InitSprite Erfolglos" 		)

	CatchError(   OpenWindow			(  0, 0, 0, 800, 600,
													"ICH BIN EIN FENSTER DAS SEIN MUSS, AUCH WENN DER PROGRAMMIERER ES NICHT WILL, WEIL ER NUR DIE TASTATUR ABFRAGEN WILL",
													#PB_Window_Maximize  ),
						"OpenWindow Erfolglos")
					
	CatchError(   OpenWindowedScreen	(  WindowID(0) , 10, 10, 100, 100, #False, 10, #PB_Screen_WaitSynchronization  ),	"OpenWindowedScreen Erfolglos"	)

	Beep_(3000,100)
	Repeat

		Repeat
			s_keycombo = KeyCombo()
			Delay(1)
		Until s_keycombo <> ""
		
		Beep_(50,5)
		If s_keycombo_alt <> s_keycombo
			Debug (  "KeyCombo = "+s_keycombo  )
			s_keycombo_alt = s_keycombo
		EndIf
		Delay(1)
		
		Select s_keycombo
		
			Case "[ESC]"
				b_exit_program = #True
		EndSelect

	Until b_exit_program
	Beep_(500,100)
;
;}

Re: Probleme mit ExamineKeyboard

Verfasst: 25.11.2014 14:18
von Chimorin
Eine Frage: Machst du das ohne Debugger? Ich glaube der Debugger muckt auf, wenn man InitKeyboard() vor InitSprite() aufruft.

Ohne Debugger kann man die Keyboardbefehle auch ohne Screen benutzen, aber das geht glaube ich nur mit Dx.

Re: Probleme mit ExamineKeyboard

Verfasst: 25.11.2014 17:50
von Shamos
Hallo Chimorin und danke erst mal für deine Antwort.

Es ist dem Compiler und Debugger offenbar Egal ob ich zuerst InitKeyboard() oder InitSprite() aufrufe.
Doch in der Tat hast Du mich damit darauf aufmerksam gemacht, das ich ohne einen aktivierten
Debugger die Tastaturabfragen durchführen kann. Denn sowie ich jedoch den Debugger aus habe,
muss ich kein Fenster mehr dazu öffnen. Warum auch immer das so ist, doch Danke für den Hinweis.

Ist das nun ein Bug oder ein Feature des PB-Debuggers? :)

Re: Probleme mit ExamineKeyboard

Verfasst: 26.11.2014 08:35
von Danilo
Shamos hat geschrieben:Doch in der Tat hast Du mich damit darauf aufmerksam gemacht, das ich ohne einen aktivierten
Debugger die Tastaturabfragen durchführen kann. Denn sowie ich jedoch den Debugger aus habe,
muss ich kein Fenster mehr dazu öffnen. Warum auch immer das so ist, doch Danke für den Hinweis.

Ist das nun ein Bug oder ein Feature des PB-Debuggers? :)
Das ist nicht auf allen Systemen möglich, deshalb beanstandet es der Debugger.
Wenn es auf Windows zufällig geht hast Du Glück. Der offizielle, platformunabhängige,
PureBasic-Weg ist aber, dafür ein Fenster/Screen mit entsprechender Nachrichtenverarbeitung
offen zu haben.

Du kannst um solche Befehle ein DisableDebugger/EnableDebugger rum legen, dann wird
es auch mit Debugger nicht mehr beanstandet, und Du kannst ihn in anderen Programmteilen
weiterhin benutzen.

Re: Probleme mit ExamineKeyboard

Verfasst: 26.11.2014 08:51
von Chimorin
Wie schon angemerkt liegt das an DirectX; Somit funktionieren die Tastatursachen ohne Screen.

http://www.purebasic.fr/english/viewtop ... 16&t=60763

Das mit dem Disable/Enable Debugger ist ne gute Idee, danke :)