Repräsentation nicht druckbarer Zeichen über die Tastatur



  • Hallo zusammen

    Im Anschluss an mein letztes Problem: (das wohl gelöst scheint)
    Ich habe das mit den Tastaturcodes leider noch nicht ganz verstanden.

    Ich muss einen Barcode-Scanner auslesen.
    Den Scanner lasse ich ein "globales Startzeichen" senden.
    Damit das nicht mit irgendwelchen Aktionen auf der Tastatur verwechselt wird,
    habe ich mich für eine Auswahl aus einigen "nicht druckbaren Zeichen" entschieden.
    Ich muss eine gewisse Auswahl bereitstellen, da ich einige dieser Zeichen auch schon
    innerhalb eines Barcodes gefunden habe.

    Meine Auswahl fiel auf die Zeichen "0x01", "0x02", "0x1C", "0x1D", "0x1F".
    Diese findet man auch in allen ASCII-Tabellen, und sie werden im Scanner auch über
    diesen Hex-Wert eingestellt. (Also die Zeichen SOH, STX, FS, GS, RS, US)

    Nun bekomme ich vom Scanner aber nur Tastaturcodes zurück, mit denen auch diese
    Zeichen repräsentiert werden. Und im Netz findet man sehr wenige Beispiele, wo
    diese Tastaturcodes zu allen ASCII-Zeichen zugeordnet sind. Hier arbeite ich mit
    der Tabelle von Thorsten Horn.

    In der Bedienungsanleitung zu meinem Scanner habe ich übrigens dieselbe gefunden!
    Und die gehört auch zur Standardeinstellung des Scanners!

    https://www.torsten-horn.de/techdocs/ascii.htm

    Meine Zeichen sind da also auch enthalten. Sie haben keine Scancodes aber sind
    durch CTRL-Zeichen repräsentiert, also durch Ctrl-Taste plus eine Zeichen-Taste.
    Das kann ich gemäss dieser Tabelle für meine ersten beiden Zeichen nachvollziehen.
    Also die Angaben "Ctrl a", "Ctrl b" (seltsamerweise dort als Grossbuchstaben angegeben)
    stimmen noch.
    Dann wirds aber schräg!

    In der Tabelle stehen dafür "Ctrl \", "Ctrl ]", .. (blöderweise Zeichen, die eigentlich
    noch die Shift oder AltGr Taste benötigen würden.
    Die "AltGr"-Taste kommt über meinen Tastatur-Hook gar nicht durch.
    Ich merke mir momentan nur das letzte Steuerzeichen. Das scheint wohl das "Ctrl" zu sein.
    Diese Zeichen erkenne ich momentan über den VK-Code (virtual key code).

    Somit bekomme ich stattdessen: "Ctrl #", "Ctrl +", "Ctrl 6", "Ctrl ß".
    Das sind alles Zeichen, die auf der dt Tastatur ohne Shift oder AltGr daherkommen.
    Auf diesen Tasten befindet sich auch kein Zeichen, das in der ASCII-Tabelle für den gewünschten ASCII-Code angegeben ist.

    Meine Frage:
    Auf was kann ich mich nun eigentlich verlassen?
    Warum steht das so in der Tabelle, obwohl es doch offensichtlich nicht stimmt?
    Und wie verhält es sich bei einer Russischen oder Chinesischen Tastatur?
    Und wie würde man für russisch, chinesisch einen Scanner einstellen? (eigentlich doch genau wie die Tastatur?)
    Auch bei einfacheren Tastaturen wie französisch, spanisch, ... ?

    Meine Tastatur ist gerade deutsch/Deutschland.
    Die Tabelle zeigt "Windows-1252" und ISO-8859-1

    Hat irgend jemand eine Ahnung davon?
    Vielen Dank an Euch alle.



  • @elmut19 sagte in Repräsentation nicht druckbarer Zeichen über die Tastatur:

    In der Tabelle stehen dafür "Ctrl ", "Ctrl ]", .. (blöderweise Zeichen, die eigentlich
    noch die Shift oder AltGr Taste benötigen würden.

    tipp: UK/US keyboard layout.



  • @Cardiac

    Oh!
    Vielen Dank Cardiac! Du hast Recht!

    Mein Scanner war tatsächlich noch auf Default US eingestellt.
    Konnte die Anwendung gestern in Frankreich ausprobieren.
    Da ging mir dann ein Licht auf.



  • @Cardiac
    Hallo Cardiac,

    nun ist der Thread zwar schon recht alt(hatte Urlaub),
    aber leider gehts bei mir trotzdem nicht.

    Das mit dem "Country Mode" des Scanners war zwar auch mein Fehler,
    nun kann ich meine Anwendung leider nicht auf ein anders sprachiges System einstellen!

    Der Scanner muss ja auch in Frankreich, Spanien, Russland, China, ... funktionieren!
    Nun gehts leider nur auf deutsch.

    Natürlich stelle ich alles (was mir bekannt ist) um:
    Ich ändere das Gebietsschema über das Control Panel und dann "Region",
    und ich ändere natürlich die Tastatur auf das zur Sprache gehörende Layout.
    Beim Scanner stelle ich natürlich auch den Country Mode ein!
    Ausserdem starte ich auch den Rechner neu (zur Sicherheit).
    Momentan wechsle ich zwischen frz. u. deu.

    Obwohl ich in meiner Software auch die Ländereinstellung berücksichtige, bekomme ich für die oben genannten "nicht druckbaren Zeichen" andere Zeichen zurück.

    Was mache ich denn noch falsch???

    Hier noch mein function, mit der ich das Zeichen ermittle:

    static int scan2ascii(DWORD scancode, USHORT* result)
    {
    	static HKL layout = GetKeyboardLayout(0);
    	static BYTE State[256];
    
    	ZeroMemory(State, sizeof(State));  // bewusst auf NULL gesetzt, da Scanner
    	UINT vk = MapVirtualKeyEx(scancode, 1, layout);
    
    	return ToAsciiEx(vk, scancode, State, result, 0, layout);
    }
    

    Meiner Meinung nach müsse es an der "ToAsciiEx(..)" liegen, da Scancode und VK für alle Sprachen gleich raus kommen.
    Nur das "layout", das sich verständlicherweise gemäss der Tasttatur ändern muss,
    ist anders.

    Es ist jedenfalls nur das Startzeichen (Global Prefix) des Scanners, das falsch ausgewertet wird.
    Wenn ich mir das Resultat des Barcodes ansehe, dann wird der in der anderen Sprache korrekt zurückgegeben.

    Vielen Dank für Eure Unterstützung



  • @elmut19 ich muss vielleicht erwaehnen das ich nur durch zufall auf deinen post gestossen bin und keinerlei ahnung von MFC/windows habe

    Die keycodes waren das einzige was mir als grundlegender flaw aufgefallen sind.



  • @Cardiac
    Vielen Dank Cardiac für Deine Rückmeldung.

    Es wäre möglich gewesen, dass Du Ahnung von Barcode-Scannern hast.
    Auf dem Gebiet bin ich leider auch recht neu.

    Den Barcode gibt mein Programm auch gemäss der Ländereinstellungen beider Geräte, also Scanner u. Windows, korrekt wieder.

    Nur habe ich Probleme mit den Startzeichen des Scanners, dem sog. "Global Prefix".
    Dieser wird bei den genannten Zeichen leider nicht so umgesetzt, wie es die ASCII-Tabelle vorschreibt.
    Es werden da schon mal grundsätzlich andere Zeichen gesendet.
    Zwar auch mit "Ctrl + Taste" aber anderer Taste.
    Z.B. für das ASCII-Zeichen "RS" kommt ein "Ctrl + 6" (anscheinend in jeder Ländereinstellung des Scanners).
    Laut ASCII-Tabelle müsste es ein "Ctrl + ^" sein.
    Im Franz. müsste es aber zumindest "Ctrl + Shift + 6" sein.
    Zusätzlich wird dann aber auch kein "Shift" mitgeschickt, wenn dasselbe Zeichen in der anderen Sprache eben dieses "Shift" zusätzlich braucht!

    Nun weiss ich einfach nicht, woran es liegt: mein Prog., Windows, Scanner ??
    Ist es von Scanner-Hersteller zu Hersteller unterschiedlich?

    Trotzdem sehr lieb von Dir, dass Du überhaupt eine Rückmeldung gegeben hast.
    Danke.


Log in to reply