Die Aufgabe besteht darin, Code zu schreiben, um zu identifizieren, welche Taste auf der Tastatur gedrückt wird. Sie können davon ausgehen, dass jeweils nur eine Taste gedrückt wird und dass ein standardmäßiges US-Tastaturlayout vorliegt. Das ist das Layout mit dem @ über dem 2.
Ihr Code sollte eine eindeutige Kennung für jede gedrückte Taste ausgeben. Dies umfasst PrtScn, Bildlaufsperre, Pause, linke Umschalttaste, rechte Umschalttaste, linke Strg-Taste, rechte Strg-Taste, Feststelltaste, Tabulator, Eingabetaste, Eingabetaste auf dem Nummernblock, Nummerntaste, Einfügen, Einfg auf dem Nummernblock, Rücktaste, Entf, F1 ... F12, Esc, linke Windows-Taste, rechte Windows-Taste, Alt, AltGr, Anwendungstaste (Kontextmenü) und so weiter.
Ihr Code sollte weiterhin auf Tastendruck warten und seine Identität ausgeben, bis er getötet wird. Es sollte jedoch die Kennung ausgeben, sobald eine Taste losgelassen wird. Es sollte keine andere Aktion von den Tastendrücken ausführen, die es empfängt, und es sollte nichts außer der eindeutigen Kennung ausgeben.
Zeigen Sie in Ihrer Antwort, was Sie für die folgenden Tastendrücke ausgeben: Tab, Pause, Eingabe, Eingabe auf dem Ziffernblock, linke Windows-Taste, rechte Windows-Taste, Einfügen und Einfügen auf dem Ziffernblock.
Wenn Sie eine ganz andere Tastatur haben, besteht die Herausforderung immer noch darin, für jede einzelne Taste Ihrer Tastatur eine andere Kennung auszugeben.
Antworten:
x86-Maschinencode, ausführbare DOS-Datei,
29* 28 ByteDies ist eine ausführbare COM-Datei für MS-DOS , für die eine IBM PC-kompatible Hardware erforderlich ist .
Besonders ein 8042 PS / 2 Controller oder eher eine Emulation davon durch SMM .
Um es kurz zu machen, es sollte in jedem Mainstream-PC sofort funktionieren.
Der Quellcode ist
Ich habe das Programm in zwei Teile geteilt.
Der erste Teil befasst sich mit dem Lesen der Scancodes . Scancodes sind numerische Werte, die jedem Schlüssel zugeordnet sind.
Beachten Sie, dass dies Hardware-Code ist und nicht vom Betriebssystem oder dem Zeichensatz abhängt. Sie sind wie ein codiertes Paar (Spalte, Zeile) des Schlüssels.
Jede Taste hat einen Scancode, auch die ungewöhnlichen Funktionstasten, die auf einer Tastatur zu finden sind (z. B. die "Open Calc" -Taste).
Einige Schlüssel haben Multibyte-Scancode, sie haben Präfixe, mit denen der Stream nur anhand der Bytefolge dekodiert werden kann.
So erhält jede Taste eine eindeutige Kennung, sogar STRG, UMSCHALT, WinKeys und so weiter.
Es werden nur die "Break Codes" verarbeitet, die beim Loslassen eines Schlüssels gesendet werden. Die "Make Codes" werden ignoriert.
Die Former haben das höhere Bit (Bit 7 für ein Byte) gesetzt, so dass es leicht zu erkennen ist.
Der zweite Teil befasst sich mit dem Drucken eines Bytes.
Der Druck ist in der Montage immer langwierig, wir haben keine eingebauten.
Um es kurz zu halten, und da war es erforderlich zu schreiben eine Kennung des Schlüssels , habe ich Dezimal- oder Hexadezimalzahlen zugunsten einer persönlichen Kodierung aufgegeben.
Ein Byte xy, wobei x das höhere Halbbyte und y das niedrigere ist, wird als zwei aufeinanderfolgende Zeichen c 0 und c 1 gedruckt, die wie folgt definiert sind:
c 0 = 0x21 + y
c 1 = 0x21 + x
Beachten Sie, dass der untere Teil zuerst gedruckt wird (dies ersparte mir einen Tausch).
Das Grundprinzip besteht darin, jeden der 16 möglichen Werte eines Halbbytes in aufeinanderfolgende ASCII-Zeichen von '!' Abzubilden.
Einfach ausgedrückt ist dies eine Hex-Zahl, aber mit
!"#$%&'()*+,-./01
als Ziffer (als) statt0123456789abcdef
Wenn Sie es in DOSBox ausführen und eine zufällige Taste drücken (von denen einige eine spezielle Taste ist, beachten Sie jedoch, dass DOSBox als Windows-Prozess nicht alle Tasten erfassen kann), werden die Ergebnisse erzielt
Beachten Sie, dass dieses Programm niemals beendet wird (außerdem übernimmt es die vollständige Kontrolle über den PC, indem die Interrupts deaktiviert werden), wie ich es von der Frage gewollt habe (es gibt einfach kein Beenden von Prozessen unter DOS).
* Dank CodyGray reduziert .
quelle
IN
Befehls in Bezug auf Bytes kleiner ist als das Aufrufen der ROM-BIOS-Interrupts (z. B.int 16h
Funktion 10h)?in
Anweisung gesprungen . Das ist eigentlich ein sehr guter Punkt, den Sie haben. Wenn Sie es noch nicht getan haben, warum veröffentlichen Sie es nicht als Antwort? :)xchg
der Akku eines der Register 1 Byte, das ist also besser als ein 2-Bytemov
.int 16h
ist, dass ich keine Scan-Codes für die Umschalttasten, die Bildlaufsperre oder Pause / Pause (möglicherweise andere) erhalte, und das ist für die Herausforderung erforderlich. Ihre Lösung, die Eingabe direkt von der E / A zu lesen, funktioniert, obwohl sie für mich den gleichen Wert für alle Schlüssel im Cluster Ins / Del / Home / End / PgUp / PgDown zurückgibt.Java 7 oder höher,
246228 BytesUngolfed:
-18 dank @ OlivierGrégoire für
show()
,0<0
undimport java.awt.event.*;
Was in ... endet:
Sogar das Drücken der Umschalttaste für Großbuchstaben, die Windows-Taste, die Feststelltaste usw. wird ausgeführt. Sie können sehen, dass auch die Modifikatoren gedruckt werden, bei denen es sich um gehaltene Tasten handelt.
quelle
HTML (mit Javascript),
4631 Zeichen,4631 BytesVerwenden Sie dies , um die Eingabe und Rückgabe von Nummernblöcken, LControl und RControl zu unterscheiden ...Nicht mehr, da Apsillers einen Weg gefunden haben, dies mit einem signle-Funktionsaufruf zu tun.Spezifische Ausgänge:
AUSGABEN, DIE NOCH MIT DEN ZAHLEN SIND, KANN ICH NICHT AUF MEINEM LAPTOP PRÜFEN
BITTE, HABE
PrtScn -> PrintScreen
Scroll Lock -> ScrollLock
Pause -> Pause
links Shift -> ShiftLeft
rechts Shift -> ShiftRight
links Ctrl -> ContrlLeft
rechts Ctrl -> ControlRight
Caps Lock -> CapsLock
Tab -> Tab
Enter -> Enter
Enter für die Nummer pad -> NumpadEnter
Num Lock -> NumLock
Insert -> Insert
Ins auf dem Nummernblock -> Numpad0
Backspace -> Backspace
Del -> Löschen
F1 ... F12 -> F1 bis F12
Esc -> Escape
left Windows key -> MetaLeft application Taste (Kontextmenü) -> Kontextmenü
right Windows-Taste -> MetaRight
Alt -> AltLeft
AltGr -> AltRight (Art Buggy, es erkennt ControlLeft und dann AltRight,aber es ist in der Tat AltRight)
EDITs:
1 Byte gespart,
;
nachdem der Funk-Aufruf18 Byte gespart hat, dank Lil 'Bits und ETHproductions. Sie haben bemerkt, dass ich vergessen habe, Funk- und Var-Namen zu kürzen.
Dank RogerSpielker konnten 32 Bytes eingespart werden. Er bemerkte, dass ich ohne Grund getrennten Code ausführte. und wieder -2 Bytes:
onkeydown
->onkeyup
1 Byte gespeichert: kein abschließender Schrägstrich erforderlich
2 Bytes gespeichert dank CraigAyre:
with()
Funktion2 Bytes gespeichert dank ASCII-only:
key
anstelle vonwhich
4 Bytes gespeichert, da wir Text haben, besteht keine Notwendigkeit für
'-'+
(jeder Bezeichner ist ohne dies einzigartig) 1 Byte gespeichert dank nur ASCII (wieder): kein schließendes Symbol mehr>
15 Bytes gespeichert dank Apsilierern, wie oben in meiner Antwort erwähnt.quelle
<body onkeydown=return!!alert(event.code)>
false
keydown
Tcl / Tk, 22 Zeichen
Probelauf:
Anmerkungen:
clevereDesigner hat den Schalter für die Hintergrundbeleuchtung eingesetzt)quelle
Bash mit X.org, 21 Bytes
Leider kann ich es nicht testen, da ich unter Linux ein MacBook besitze - kein PrntScr, keine numerische Tastatur und alles.
xev
ist ein Tool, das Maus- und Tastaturereignisse ausgibtX.org
. Ich leite es an awk weiter, filtere gerade Zeilen (da jede Taste beim Drücken und dann beim Loslassen angezeigt wird) und wähle nur diejenigen aus, die enthalten(k
- diese Zeichenfolge steht in jeder Zeile, die die gedrückte Taste beschreibt.quelle
showkey -s
dort verwenden: P) oder auf einem reinen Wayland-GUI-Desktop nicht funktionieren . Dies ist wirklich eine bash + Xorg Antwort.C und Win32,
240224216205202194191 BytesAusgänge
TAB:
F0008C00F0008
PAUSE:
450012C0450012
ENTER:
1C000CC01C000C
NUMPAD-ENTER:
11C000CC11C000C
WINDOWS-LEFT:
15B005AC15B005A
WINDOWS-RIGHT:
15C005DC15C005D
INSERT:
152002CC152002C
NUMPAD-INSERT:
52002CC052002C
Erläuterung
Bearbeitungen
-16 danke an @ugoren
-8: geändert
WNDCLASS
inint
Array, da alle 10 Mitglieder 4 Bytes sind-11: Teilinitialisierung des wndclass-Datenarrays, reduziert auf 9 Elemente
-3: implizite Verwendung
int
Deklaration für wndclass-Datenarray-8: Zeilenumbruch aus dem Ausgabeformat entfernen (nicht erforderlich in spec und printf wird sofort ohne diesen gelöscht); Bewegen Sie
RegisterClass
sich mitCreateWindow
return in argATOM
. setze wndclass name aufm
den nur ein Null-Byte benötigt wird, um eine gültige Zeichenfolge zu sein.-3:
w
var fürMSG
Daten wiederverwendenquelle
<iostream>
+std::cout<<a^b<<"\n"
ist länger. Außerdem müssten Sie die Rückgabetypen zu den Funktionsdeklarationen hinzufügen, undm
das kann nicht implizit seinint
.for(;GetMessage(&m,0,16,0);)DispatchMessage(&m);
p(x,y,a,b)
und(void*)p
sollte einige retten.Java (OpenJDK 8) , 369 Byte
Dies kann nicht mit TIO ausgeführt werden, da es eine grafische Oberfläche verwendet, aber auf meinem Computer funktioniert.
Ungolfed / Erklärung:
quelle
setFocusTraversalKeysEnabled(false);
in Ihrer Antwort wird dies beheben.Scala 2.10+, 279 Zeichen, 279 Byte
Nun, das ist eine Scala-Antwort :), obwohl es sich anfühlt, als würde ich Java machen. Jedenfalls können wir es nicht mit TIO testen.
Es ist traurig, dass wir alle geerbten Methoden deklarieren müssen, auch wenn wir sie nicht verwenden: Kann ich sie aus der Byteanzahl entfernen, da einige Compiler-Flags es erlauben, sie nicht zu deklarieren?
Dies druckt (wie für meine HTML-Js-Antwort) die Taste gedrückt, "-" und dann seine "Position".
Zum Beispiel :
PrtScn -> nicht überprüfbar
Scroll Lock -> 145-1
Pause -> 19-1
links Shift -> 16-2
rechts Shift -> 16-3
links Ctrl -> 17-2
rechts Ctrl -> 17-3
Caps Lock -> 20-1
Tab -> nicht verifizierbar
Enter -> 10-1
Enter auf dem Nummernblock -> 10-4
Num Lock -> 144-4
Insert -> 96-1
Ins auf dem Nummernblock -> 96-4
Backspace -> 8-1
Entf -> 127-1
F1 ... F12 -> 112-1 bis 123-1
Esc -> 27-1
linke Windows-Taste -> 524-2
rechte Windows-Taste -> 524-3
Alt -> 18- 2
AltGr -> 18-3 (Art von Buggy, erkennt 17-2 und dann 18-3,aber es ist in der Tat 18-3)
Anwendungsschlüssel (Kontextmenü) -> 525-1
Obwohl ich denke, dass es vom Computer abhängt: / Ich bin gerade auf einem Azerty-Laptop.
quelle
-std=c89
da moderne Compiler standardmäßig c99 oder c11 verwenden, dies muss jedoch nicht gezählt werden. Ich bin mir also nicht sicher, wie das Urteil aus Code-Golf-Meta lauten würde.TI-BASIC, 19 Bytes
Hier ist eine Illustration der restlichen Tasten:
Erläuterung:
Dies ist in Arnold C leider nicht möglich, so dass ich mich an TI-BASIC halten musste.
quelle
C #, 144 + 601 = 745 Bytes
Besteht aus zwei Klassen, konnte ich sie nicht erfolgreich zu einer Klasse zusammenfassen.
Hauptklasse:
Hakenklasse:
Ausgänge:
137
147
141
142
220
221
174
224
quelle
||
auf|
und anderen ähnlichen Golf spielen , aber mein Gehirn braucht eine Pause nach , das zu tun!public int v;public int c;public int f;
könnte man wohl verkürzen aufpublic int v,c,f;
AutoHotkey , 26 Bytes
Kann nicht testen (nur Win), aber die
M
Option sagtAlso sollte es gut gehen.
quelle
WinApi C ( gcc ), 156 Bytes
Dieses Programm druckt den Windows-Virtual-Key-Code aus, der jeder Tastatureingabe zugeordnet ist. Die
\n
in derprintf
Format-Zeichenfolge ist optional (macht die Ausgabe jedoch benutzerfreundlich) und kann für eine Gesamtpunktzahl von 154 Bytes gelöscht werden . Eine einfache Möglichkeit, das Programm (ohne taskmgr) zu beenden, ist mitCTRL + PAUSE
. Wenn Sie eine Tastatur mit einer Fn-Taste haben, kann dieses Programm diese nicht aufheben, da sie von Windows nicht einmal bemerkt wird.#include <d3d.h>
Trick und die Inspiration für dasBYTE
Array.Das Programm mit lokalen Variablen, Lesbarkeit und ohne Compiler-Warnungen sieht folgendermaßen aus:
quelle
C (gcc) + Win32, 94
9598105107110BytesDer Code erfasst Schlüssel, auch wenn der Fokus verloren geht.
In den folgenden Screenshots werden Leerzeichen zwischen den Ausgaben eingefügt (
printf("%d ",j);
zur besseren Lesbarkeit +1 Byte) aufgenommen:Left-ctrl Left-win Left-alt Space Right-alt Right-win Right-menu Right-ctrl Left-shift Z X C Right-shift Left-shift 1 2 3 Num 1 Num 2 Num 3 Left-shift +/= (on the main part) Num + Left-alt PrtScn
Der Code
GetAsyncKeyState
fragt den Schlüsselstatus ab, ohne die Nachrichtenwarteschlange zu überprüfen, normalerweise in Echtzeit als bei anderen Benutzermodus-Ansätzen (außer DirectInput). Dieser Ansatz ist in Keyloggern weit verbreitet.(j<16||j>18)
filtert reguläre Strg / Alt / Shift. 16/17/18 wird immer dann ausgelöst, wenn eine der Tasten links oder rechts gedrückt wird, zusammen mit dem vom Standort angegebenen vTastenwert.quelle
PowerShell, 34 Byte
Ausgänge in derselben Zeile wie der Eingang, was etwas verwirrend sein kann.
quelle