KeyCode bei AppEvent
Moderator: Moderatoren
KeyCode bei AppEvent
Weil mein Program manchmal gehangen hat bei meiner eingen inkey-Funktion, habe ich die Keycodes protokolliert.
KleinBuchstaben a=65601 b=65602 ....z=65626
GroßBuchstaben A=196673 B=196674 ....Z=196698
Ziffern über Tasten 0=65584 1=65585 .....9=65593
Ziffern Numerikblock 0=65632 1=65633 .....9=65641
Sonderzeichen lasse ich mal aus.
In keiner Includedatei habe ich diese Codes gefunden!
Hat einer eine Idee wo die herkommen? Natürlich könnte ich mir eine eigene Übersetzungstabelle schreiben, aber sind denn diese Codes normal?!
KleinBuchstaben a=65601 b=65602 ....z=65626
GroßBuchstaben A=196673 B=196674 ....Z=196698
Ziffern über Tasten 0=65584 1=65585 .....9=65593
Ziffern Numerikblock 0=65632 1=65633 .....9=65641
Sonderzeichen lasse ich mal aus.
In keiner Includedatei habe ich diese Codes gefunden!
Hat einer eine Idee wo die herkommen? Natürlich könnte ich mir eine eigene Übersetzungstabelle schreiben, aber sind denn diese Codes normal?!
- Martin Altmann
- Foren-Administrator
- Beiträge: 16555
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Michael,
willkommen im Klub
Unter Windows wird ja nur mittels "Events" gesprochen - und da Events sowohl von der Tastatur als auch der Maus (und natürlich noch von wesentlich mehr, aber die beiden sollen hier mal reichen) ausgelöst werden und man dies im Programm unterscheiden können muss, werden die Events in Kategorien eingeteilt (also in diesem Beispiel "Mausevent" und "Tastaturevent").
Am besten schaust Du mal in der Hilfe unter dem Stichpunkt "Tastatur und Maus" nach - dort findest Du zwar keinen Verweis auf Includedateien, aber das ganze an sich ein wenig erklärt.
Die Codes sind so normal und sollten Standardwindowscodes sein!
Viele Grüße,
Martin
willkommen im Klub
Unter Windows wird ja nur mittels "Events" gesprochen - und da Events sowohl von der Tastatur als auch der Maus (und natürlich noch von wesentlich mehr, aber die beiden sollen hier mal reichen) ausgelöst werden und man dies im Programm unterscheiden können muss, werden die Events in Kategorien eingeteilt (also in diesem Beispiel "Mausevent" und "Tastaturevent").
Am besten schaust Du mal in der Hilfe unter dem Stichpunkt "Tastatur und Maus" nach - dort findest Du zwar keinen Verweis auf Includedateien, aber das ganze an sich ein wenig erklärt.
Die Codes sind so normal und sollten Standardwindowscodes sein!
Viele Grüße,
Martin
Hallo Martin,
erst einmal Danke. Das ist mir im Prinzip alles klar. Doch das Problem ist, ich will die Ereignisse auswerten und wenn ich Tastencodes bekomme, die nirgendwo erklärt werden und ich nur durch Probieren die Bedeutung herausbekomme, dann fühl ich mich doch etwas verunsichert.
Bei diesen von mir genannten Codes bekam ich eine Rückmeldung über den Lautsprecher des PC doch mein Programm konnte mit ihnen nichts anfangen.
Nach einer Ruhepause bekam ich wieder ganz normale Tastaturcodes, die mein Programm verarbeiten kann. Wie schon ausgeführt, außer dem Brummen des Lautsprechers beim Tastenanschlag, hing das Programm. Meine Frage nach Include-Dateien betrifft ja nur eine vollständige Auflistung dieser aus meiner Sicht sonderbaren Codes, damit ich sie der normelen Auswertung zuführen kann.
Gruß Michael
erst einmal Danke. Das ist mir im Prinzip alles klar. Doch das Problem ist, ich will die Ereignisse auswerten und wenn ich Tastencodes bekomme, die nirgendwo erklärt werden und ich nur durch Probieren die Bedeutung herausbekomme, dann fühl ich mich doch etwas verunsichert.
Bei diesen von mir genannten Codes bekam ich eine Rückmeldung über den Lautsprecher des PC doch mein Programm konnte mit ihnen nichts anfangen.
Nach einer Ruhepause bekam ich wieder ganz normale Tastaturcodes, die mein Programm verarbeiten kann. Wie schon ausgeführt, außer dem Brummen des Lautsprechers beim Tastenanschlag, hing das Programm. Meine Frage nach Include-Dateien betrifft ja nur eine vollständige Auflistung dieser aus meiner Sicht sonderbaren Codes, damit ich sie der normelen Auswertung zuführen kann.
Gruß Michael
- Martin Altmann
- Foren-Administrator
- Beiträge: 16555
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Michael,
da das (meiner Meinung nach) Standardwindowscodes sind, wirst Du die auch in keiner Alaska-eigenen include-Datei finden.
Es gibt eine windows.h, die bei diversen (C-)Programmiersprachen mitgeliefert wird. In dieser solltest Du die Standardevents finden.
Du kannst Dir z.B. von Microsoft das Visual C++ Toolkit 2003 herunterladen.
Viele Grüße,
Martin
da das (meiner Meinung nach) Standardwindowscodes sind, wirst Du die auch in keiner Alaska-eigenen include-Datei finden.
Es gibt eine windows.h, die bei diversen (C-)Programmiersprachen mitgeliefert wird. In dieser solltest Du die Standardevents finden.
Du kannst Dir z.B. von Microsoft das Visual C++ Toolkit 2003 herunterladen.
Viele Grüße,
Martin
Hallo Martin;
nochmal ich. Beim serven im Internet habe ich natürlich verschiedenen Windows.h-Dateien gefunden, aber diese enthalten wieder andere include-Dateien, die sie aufrufen. Ich suche ganz einfach nach einer allgemeinen Übersetzungstabelle für die von mir zuerst genannten Key-Codes. Natürlich könnte ich weiter probieren. Aber dazu muß ich warten bis mein Programm wieder "hängt" und über die doppelte Protokollierung der von mir gedrückten Tasten die Codes herausbekommen. D.h. ich muß mir jede Taste, die ich gedrückt habe aufschreiben und danach sie meiner vom Programm erstellten Protokolldatei zuordnen. Ziemlich mühseelig!
Ich hoffte einen einfacheren und sicheren Weg zu finden.
MfG
Michael
nochmal ich. Beim serven im Internet habe ich natürlich verschiedenen Windows.h-Dateien gefunden, aber diese enthalten wieder andere include-Dateien, die sie aufrufen. Ich suche ganz einfach nach einer allgemeinen Übersetzungstabelle für die von mir zuerst genannten Key-Codes. Natürlich könnte ich weiter probieren. Aber dazu muß ich warten bis mein Programm wieder "hängt" und über die doppelte Protokollierung der von mir gedrückten Tasten die Codes herausbekommen. D.h. ich muß mir jede Taste, die ich gedrückt habe aufschreiben und danach sie meiner vom Programm erstellten Protokolldatei zuordnen. Ziemlich mühseelig!
Ich hoffte einen einfacheren und sicheren Weg zu finden.
MfG
Michael
- Martin Altmann
- Foren-Administrator
- Beiträge: 16555
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Michael,
das ist nicht nur die windows.h sondern das komplette Visual C++ Toolkit!
Du hast auf der Seite (oben, Mitte) einen Knopf "Download" - da rauf klicken, runterladen und installieren!!
Nach der Installation findest Du auch (nicht nur) die windows.h-Datei.
Xbase++ ist ja in C (oder C++?) entwickelt.
Viele Grüße,
Martin
das ist nicht nur die windows.h sondern das komplette Visual C++ Toolkit!
Du hast auf der Seite (oben, Mitte) einen Knopf "Download" - da rauf klicken, runterladen und installieren!!
Nach der Installation findest Du auch (nicht nur) die windows.h-Datei.
Xbase++ ist ja in C (oder C++?) entwickelt.
Viele Grüße,
Martin
Toolkit
Hallo Martin,
bin anscheinend doch zu blöd. Habe das komplette Toolkit heruntergeladen.
Was ich damit soll ist mir allerdings nicht klar, da ich nicht in C++ programiere. Habe auch die Include-Dateien des Toolkit durchgescannt aber keine mit einer entsprechenden Übersetzungstabelle gefunden!
Was mir immer noch nicht klar ist warum mir XBase++ bei meinen Tastatureingaben in der Eventloop meistens ganz normale Antworten gibt, also ASCII-Zeichencodes und dann plötzlich diese sonderbaren Codes. und nach einer Pause wieder ASCII. Da scheint doch irgend etwas nicht in Ordnung zu sein!
MfG
Michael
bin anscheinend doch zu blöd. Habe das komplette Toolkit heruntergeladen.
Was ich damit soll ist mir allerdings nicht klar, da ich nicht in C++ programiere. Habe auch die Include-Dateien des Toolkit durchgescannt aber keine mit einer entsprechenden Übersetzungstabelle gefunden!
Was mir immer noch nicht klar ist warum mir XBase++ bei meinen Tastatureingaben in der Eventloop meistens ganz normale Antworten gibt, also ASCII-Zeichencodes und dann plötzlich diese sonderbaren Codes. und nach einer Pause wieder ASCII. Da scheint doch irgend etwas nicht in Ordnung zu sein!
MfG
Michael
- Martin Altmann
- Foren-Administrator
- Beiträge: 16555
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Michael,
sorry - ich hätte gedacht, dass in der windows.h die entsprechenden Codes stünden!
wie sieht denn Deine Eventloop aus? Filterst Du explizit die Tastaturevents aus (xBeP_keyboard) - wenn nicht, hast Du dort auch Deine Maus-Events, Resize-Events und sonstige Events...
Viele Grüße,
Martin
sorry - ich hätte gedacht, dass in der windows.h die entsprechenden Codes stünden!
wie sieht denn Deine Eventloop aus? Filterst Du explizit die Tastaturevents aus (xBeP_keyboard) - wenn nicht, hast Du dort auch Deine Maus-Events, Resize-Events und sonstige Events...
Viele Grüße,
Martin
Programm beispiel zur Eventloop
Hallo Martin,
würde Dir gern Codebeispiel schicken. Komme jedoch mit dem neuen Forum noch nicht zurecht. Eine kleine Gebrauchsanleitung/ Einführung wäre hilfreich.
Wenn ich meinen Quellcode mit Strg-V in dieses Fenster übernehme, wird er umformatiert und ich weiß nicht, wie ich ihn wieder in Form bringe und ggf,. Kommentare hinzufüge.
MfG
Michael[/img][/list][/list]
würde Dir gern Codebeispiel schicken. Komme jedoch mit dem neuen Forum noch nicht zurecht. Eine kleine Gebrauchsanleitung/ Einführung wäre hilfreich.
Wenn ich meinen Quellcode mit Strg-V in dieses Fenster übernehme, wird er umformatiert und ich weiß nicht, wie ich ihn wieder in Form bringe und ggf,. Kommentare hinzufüge.
MfG
Michael[/img][/list][/list]
- Martin Altmann
- Foren-Administrator
- Beiträge: 16555
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Martin,
anbei mein Code.
MfG
Michael
anbei mein Code.
MfG
Michael
Code: Alles auswählen
/*Neben dem in myinkey gestarteten Thread läuft noch ein DruckerThread, der Intervallgesteuert ist, zur Ausgabe von Druckfiles auf Bondrucker mit anschließender Löschung der Files. Später soll noch ein BackupThread zur automatischen Sicherung relevanter Kassenfiles auf Sicherungslaufwerk und optional ein Zapfthread ebenfalls intervallgesteuert zur Bedienung der Ventile an den Bierhähnen laufen.
Der okeythread überwacht einen ComPort an dem ein Kellnerschloß angeschlossen ist. Er stellt nur fest, dass da was passiert ist. Die Behandlung erfolgt dann im HauptThread.
*/
function myinkey(nwait,lnoeval)
local nstart:=seconds(),nende,nevent,mp1,mp2,o2win,l_ever:=.f.,l_focus:=.t.
local oXbp,winarea,loldcomtrap
local ctemp:=""
memvar n_lastkey,owin,okeytread,key_lock
set typeahead to 100 //dachte das hilft
lnoeval:= IIF(lnoeval=NIL, .T. ,lnoeval )
l_ever:= IIF(nwait=0, .T. , l_ever)
nevent := 0
o2win:=setappwindow()
setappwindow(owin)
winarea:=owin:calcClientRect({owin:currentpos()[1],;
owin:currentpos()[2],;
owin:currentsize()[1],;
owin:currentsize()[2]})
oXbp:=owin
nwait:= IIF(nwait=NIL,0.1 ,nwait )
nende:= IIF(nstart+nwait>=86400,nstart+nwait-86400 ,nstart+nwait )
loldcomtrap:= lcomtrap
lcomtrap:= iif(loldcomtrap,.f.,lcomtrap)
DO WHILE .T.
if !empty(okeytread) .and. okeytread:active //Thread zur Überwachung der COM-schnittstelle
millisec(10)
endif
if key_lock .and. !empty(okeytread) /Nur wenn Kellnerschloss angeschlossen bei meinen Versuchen lief dieser Thread nicht.
okeytread:start("com_key",key_com)
endif
nevent := AppEvent(@mp1,@mp2,@o2win,1)
// xbeM_LbClick
if !loldcomtrap .and. lcomtrap //Meldung dass an COM was passiert
mp1:=K_ALT_K
if okeytread:active
millisec(10)
endif
desk_bon() //Behandlung
n_kassnr:=0
setlastkey(K_ALT_K)
exit
endif
IF nEvent = 1048589 .OR. nEvent = xbeM_LbClick .OR. nEvent = xbeM_LbDblClick //Mausevent = Touch
if valtype(mp1)="A"
IF mp1[2]>winarea[4] //außerhalb des Hauptfensters
loop
ENDIF
endif
mp1:=o2win:setowner():currentpos()[1]*1000 //Position wo Touch
IF mp1=0
mp1:=o2win:setowner():setowner():currentpos()[1]*1000+o2win:setowner():setowner():currentpos()[2]
else
mp1+=o2win:setowner():currentpos()[2]
ENDIF
if !empty(okeytread) .and. okeytread:active
millisec(10)
endif
mp1:= seekascr(mp1,lnoeval) //Behandlung des Touch mit //Codeblock - Suchen von mp1 in einem array und danach ausführen des //Codeblocks der ebenfalls im array steht wenn lnoeval = .f. ansonsten //Rückgabe eines im array gespeicherten Tastenwerts.
exit
ELSEIF nEvent = xbeP_Keyboard
IF mp1#0
mp1:=n_lastkey := DC_KeyTRAN(mp1,1) //Rogers //Umwandlungsroutine
if mp1>65000
ctemp:=iif(valtype(mp1)="N",str(mp1,7),"")+"/" //Testprotokoll
n_lastkey :=keyconvert(@mp1) //eigene Konvertierung der //Werte in ASCII
ctemp+=str(mp1,7)+str(seconds(),8,1)+chr(13)+chr(10)
strfile(ctemp,"Myevent",.t.)
endif
mp1:= seekascr(mp1,lnoeval) //Behandlung des Tastendrucks //analog oben
exit
ENDIF
ENDIF
IF !l_ever .AND. nende<nstart .AND. seconds()-nstart<0 .AND. seconds()>nende
mp1:=0
exit
elseif !l_ever .AND. seconds()>nende
mp1:=0
exit
ENDIF
ENDDO
owin:=oXbp
if !empty(okeytread) .and. okeytread:active
millisec(10)
endif
lcomtrap:= iif(loldcomtrap,.t.,lcomtrap)
setappwindow(owin)
if procname(1)="TOUCHEVENT" .and. (lastkey()=K_ESC .or. mp1=K_ESC)
mp1=-1
elseif lastkey()=K_ESC
mp1=K_ESC
endif
return mp1
- Martin Altmann
- Foren-Administrator
- Beiträge: 16555
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Martin,
danke,dass Du Dir das Programm mal angeschaut hast.
owin ist das Hauptfenster. Es wird benötigt zur Berechnung der Fläche, auf der Touchevents (Maus) zulässig sind.
lcomtrap ist eine Publicvariable (memvar vergessen) die vom okthread auf .T. gesetzt wird, wenn an der beobachteten COM etwas passiert.
okeythread selbst wird in Abhängigkeit davon ob in der Inidatei mitgeteilt wurde, dass ein Kellnerschloss an irgendeinem COM-Port angeschlossen ist, in der main-Funktion als thread initialisiert.
Mit Ausnahme des vergessenen memvar, ist schon so alles richtig.
MfG
Michael
danke,dass Du Dir das Programm mal angeschaut hast.
owin ist das Hauptfenster. Es wird benötigt zur Berechnung der Fläche, auf der Touchevents (Maus) zulässig sind.
lcomtrap ist eine Publicvariable (memvar vergessen) die vom okthread auf .T. gesetzt wird, wenn an der beobachteten COM etwas passiert.
okeythread selbst wird in Abhängigkeit davon ob in der Inidatei mitgeteilt wurde, dass ein Kellnerschloss an irgendeinem COM-Port angeschlossen ist, in der main-Funktion als thread initialisiert.
Mit Ausnahme des vergessenen memvar, ist schon so alles richtig.
MfG
Michael
- Martin Altmann
- Foren-Administrator
- Beiträge: 16555
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Michael,
Du schreibst in Deinem Text von okaythread (mit h!!), im Source steht aber immer oktread (ohne h!!).
Was ist K_ALT_K?? Hast Du die mit demselben Wert belegt wie xbeK_ALT_K?
Benutze doch mal lieber PostAppEvent, statt mp1 den Wert K_ALT_K zuzuweisen.
Viel weiter kann ich Dir leider auch nicht helfen - ich habe bei mir nur "normales" Eventhandling und manipuliere die Queue nicht dermaßen.
Viele Grüße,
Martin
Du schreibst in Deinem Text von okaythread (mit h!!), im Source steht aber immer oktread (ohne h!!).
Was ist K_ALT_K?? Hast Du die mit demselben Wert belegt wie xbeK_ALT_K?
Benutze doch mal lieber PostAppEvent, statt mp1 den Wert K_ALT_K zuzuweisen.
Viel weiter kann ich Dir leider auch nicht helfen - ich habe bei mir nur "normales" Eventhandling und manipuliere die Queue nicht dermaßen.
Viele Grüße,
Martin
Hallo Martin,
Die Funktion myinkey wird an verschiedensten Stellen des Programms aufgerufen. Das Programm ist die Konvertierung eines CLipper-Programms.
Auf der einen Seite erspart das viel Arbeit auf der anderen werden Kompromisse eingegangen, die bei einer völligen Neuprogrammierung vielleicht nicht nötig wären. Ich habe ja bewußt deshalb XBasse++ gewählt.
Von der Programmlogik gibt es verschiedene Grundzustände, die oberhalb der Eventloop ausgewertet werden. Andererseits innerhalb der Eventloop werden Unterprogramme über Codesblöcke aufgerufen, die wiederum auf Tastendrücke oder Touches warten und dann weiter nach unten verzweigen.
Gleichzeitig muss ständig das Kellnerschloss überwacht werden, da das Stecken oder Ziehen eines Schlüssels sofort eine andere Programmebene bedeudet. Dafür ist das zentrale Event der Druck der Taste ALT_K. Alt_K auch deshalb, weil ohnen Kellnerschloss das über diese Tastenkombination erreicht wird. Ich konvertiere xbe_ALT_K in K_ALT_K (Clipper-Inkey.CH)=291. Alle Tastendrücke werden bei mir in Clipper-Inkeys konvertiert. Siehe oben.
Okeytread ist ja nur eine Bezeichnung für einen vorher mit :new angelegten Thread. Mit der Einschränkung, der von mir anfangs gar nicht und jetzt nur teilweise interpretierbaren Windows-Tastenevents, funktioniert mein Programm.
In der entscheidenden Sache den Windowseventcodes für Tasten sind wir allerdings nicht weitergekommen. Ich habe diesbezüglich ein Anfrage an "winboard.org" gerichtet, die haben mir eine Antwort in 24 Stunden versprochen, doch ist bisher nach 3 Tagen noch nicht eingetroffen.
Ich halte Dich auf dem Laufenden.
MfG
Michael
Die Funktion myinkey wird an verschiedensten Stellen des Programms aufgerufen. Das Programm ist die Konvertierung eines CLipper-Programms.
Auf der einen Seite erspart das viel Arbeit auf der anderen werden Kompromisse eingegangen, die bei einer völligen Neuprogrammierung vielleicht nicht nötig wären. Ich habe ja bewußt deshalb XBasse++ gewählt.
Von der Programmlogik gibt es verschiedene Grundzustände, die oberhalb der Eventloop ausgewertet werden. Andererseits innerhalb der Eventloop werden Unterprogramme über Codesblöcke aufgerufen, die wiederum auf Tastendrücke oder Touches warten und dann weiter nach unten verzweigen.
Gleichzeitig muss ständig das Kellnerschloss überwacht werden, da das Stecken oder Ziehen eines Schlüssels sofort eine andere Programmebene bedeudet. Dafür ist das zentrale Event der Druck der Taste ALT_K. Alt_K auch deshalb, weil ohnen Kellnerschloss das über diese Tastenkombination erreicht wird. Ich konvertiere xbe_ALT_K in K_ALT_K (Clipper-Inkey.CH)=291. Alle Tastendrücke werden bei mir in Clipper-Inkeys konvertiert. Siehe oben.
Okeytread ist ja nur eine Bezeichnung für einen vorher mit :new angelegten Thread. Mit der Einschränkung, der von mir anfangs gar nicht und jetzt nur teilweise interpretierbaren Windows-Tastenevents, funktioniert mein Programm.
In der entscheidenden Sache den Windowseventcodes für Tasten sind wir allerdings nicht weitergekommen. Ich habe diesbezüglich ein Anfrage an "winboard.org" gerichtet, die haben mir eine Antwort in 24 Stunden versprochen, doch ist bisher nach 3 Tagen noch nicht eingetroffen.
Ich halte Dich auf dem Laufenden.
MfG
Michael