どのキーを押しましたか?


15

タスクは、キーボードで押されたキーを識別するコードを記述することです。一度に1つのキーのみが押され、標準のUSキーボードレイアウトがあると仮定できます。これは、2の上に@が付いたレイアウトです。

コードは、押されたキーの一意の識別子を出力する必要があります。これには、PrtScn、Scroll Lock、Pause、左Shift、右Shift、左Ctrl、右Ctrl、Caps Lock、Tab、Enter、テンキーのEnter、Num Lock、Insert、テンキーのIns、Backspace、Del、F1が含まれます... F12、Esc、左Windowsキー、右Windowsキー、Alt、AltGr、アプリケーションキー(コンテキストメニュー)など。

コードは、キーが押されるまで待機し、キーが殺されるまでIDを出力する必要があります。ただし、キーがリリースされるとすぐに識別子を出力する必要があります。受け取ったキーを押すことで他のアクションを実行したり、一意の識別子以外に何も出力したりしないでください。

回答では、Tab、Pause、Enter、テンキーのEnter、左のWindowsキー、右のWindowsキー、テンキーのInsertとInsのキー入力に対するコード出力を示してください。

非常に異なるキーボードを使用している場合、課題はキーボード上のすべてのキーごとに異なる識別子を出力することです。


1
JS(ブラウザJS、とにかく)では、特定のキーが押されているかどうかを確認することはできません(Caps Lock、Num Lock、Scroll Lock、PrtScnなど)。これは、JSが回答できないことを意味しますか?
-ETHproductions

2
@ETHproductions確かにそうです。どこにいてもJS愛好家に謝罪します。

2
5つの回答が提供された後に変更された要件(削除されたものを含む)。...本当に公平ではないこと
オリヴィエ・グレゴワール

6
Windowsキーなど、多くのキーボード上にないキーの出力を要求するのは公平/権利ではないと思います。
Notts9017

1
@ Notts90それらは標準的な米国のキーボードレイアウトの一部ではありませんか?upload.wikimedia.org/wikipedia/commons/thumb/5/51/...

回答:


22

x86マシンコード、DOS実行可能ファイル、29 * 28バイト

FAE464D0E873FAE460D0E073F4D41005212192B402CD2188F2CD21EBE3

これはMS-DOS用のCOM実行可能ファイルであり、IBM PC互換ハードウェアが必要です。 特に8042 PS / 2コントローラー、またはSMMを介したエミュレーションの可能性が高い。 長い話を簡単に言えば、それはどんなメインストリームPCでもすぐに使えるはずです。

ソースコードは

BITS 16

 ;Disable the interrupts so we don't compete with the IRQ 1 (the 8042 main
 ;device IRQ) handler (the ISR n. 9 by default) for the reading of the codes.
 cli

_wait:

 ;Is 'Output buffer full (OBF)' bit set?

 in al, 64h                ;Read the 8042 status register             
 shr al, 1                 ;Move bit 0 (OBF) into the carry flag

jnc _wait                  ;Keep spinning if CF = OBF not set

 ;Read the scan code S
 in al, 60h

 ;Is S a break code?

 shl al, 1                 ;Bit 7 is set if it is
jnc _wait

 ;PART 2

 ;AL = S mod 10h := y, AH = S / 10h := x
 aam 16
 add ax, 2121h             ;Make both quantities in the printable ASCII range (skip space though)

 ;Print y
 xchg dx, ax
 mov ah, 02h
 int 21h                   ;int 21/ah=02 prints the char in DL

 ;DH is still valid here, it holds x. We print it now
 mov dl, dh
 int 21h

 ;Never terminate
jmp _wait

プログラムを2つの部分に分割しました。

最初の部分は、スキャンコードの読み取りを扱います。スキャンコードは、すべてのキーに関連付けられた数値です。
これらはハードウェアコードであり、OSや文字セットに依存しないことに注意してください。キーのエンコードされたペア(列、行)のようなものです。
すべてのキーにはスキャンコードがあり、一部のキーボードにある非標準の奇妙なファンクションキー(「open calc」キーなど)もあります。
一部のキーにはマルチバイトスキャンコードがあり、バイトシーケンスを見るだけでストリームを解読可能にするように設計されたプレフィックスがあります。
したがって、各キーは、CTRL、SHIFT、WinKeysなどの一意の識別子を取得します。

キーがリリースされたときに送信される「ブレークコード」のみが処理され、「メイクコード」は無視されます。
前者には上位ビット(1バイトはビット7)が設定されているため、簡単に認識できます。

2番目の部分は、バイトの印刷を扱います。
アセンブリの印刷は常に長く、組み込み機能はありません。
短くして、キーの識別子を書く必要があったため、個人的なエンコードを優先して10進数または16進数を放棄しました。

バイトxy(xは上位ニブル、yは下位ニブル)は、次のように定義された2つの連続した文字c 0およびc 1として出力されます。

c 0 = 0x21 + y
c 1 = 0x21 + x

下のニブルが最初に印刷されることに注意してください(これにより、スワップを節約できます)。
その理由は、ニブルの16の可能な値のそれぞれを「!」から連続したASCII文字にマッピングすることです。
簡単に言えば、これは16進数ですが、

  1. 交換されたニブル
  2. !"#$%&'()*+,-./01 の代わりに数字(als)として 0123456789abcdef

DOSBoxで実行し、ランダムキー(一部は特別なキーですが、WindowsプロセスとしてDOSBoxはすべてのキーをキャプチャできないことに注意してください)を押すと、

DOSBox running the key identifier

このプログラムが終了することはないことに注意してください(さらに、割り込みを無効にすることでPCを完全に制御する必要があります)。


* CodyGrayへの感謝を減らしました


IN命令を使用すると、ROM BIOS割り込み(たとえばint 16h、関数10h)を呼び出すよりもバイト数が小さくなるようになりましたか?
コーディグレー

@CodyGrayほとんどの場合、ループ全体をスキップできます。どういうわけか私はすぐにin指示に飛びついた。それは実際にあなたが持っている非常に良い点です。まだお持ちでない場合は、回答として投稿してください。:)
マーガレットブルーム

1
さて、あなたはおかしくなりました!これは、既存の回答にコメントするだけでなく、はるかに多くの作業のように思えます。:-p私は何かを組み立てて遊んでいます。楽しいヒント:ただし、コードゴルフの場合xchg、レジスタの1つとしてアキュムレーターを使用すると1バイトになるため、2バイトよりも優れていますmov
コーディグレー

1
さて、との問題はint 16h、私はシフトキー、スクロールロック、または一時停止/ブレーク(おそらく他の人)のためのスキャンコードを取得しないということであり、それは挑戦で必要とされます。I / Oから直接入力を読み取るソリューションは機能しますが、Ins / Del / Home / End / PgUp / PgDownクラスター内のすべてのキーに対して同じ値を返すように見えますが。
コーディグレー

1
@PeterCordes:PAUSEには奇妙な動作もあります。IIUCはキーを押すとブレークコードをmakeコードとともに送信し、キーを離すと何も送信しません。それとも、PC Game Programming Encyclopediaから理解したことです。
-ninjalj

12

Java 7以降、246 228バイト

import java.awt.event.*;class K{public static void main(String[]a){new java.awt.Frame(){{addKeyListener(new KeyAdapter(){public void keyPressed(KeyEvent e){System.out.println(e);}});show();setFocusTraversalKeysEnabled(0<0);}};}}

ゴルフをしていない:

import java.awt.event.*;
class K{
    static void main(String[]a){
        new java.awt.Frame(){
            {
                addKeyListener(new KeyAdapter(){
                    public void keyPressed(KeyEvent e){
                        System.out.println(e);
                    }
                });
                show();
                setFocusTraversalKeysEnabled(0<0);
            }
        };
    }
}

-18ため@OlivierGrégoireのおかげでshow()0<0import java.awt.event.*;

結果:

enter image description here

大文字の文字、Windowsキー、キャップロックなどのShiftキーを押した場合でも処理します。

java.awt.event.KeyEvent[KEY_PRESSED,keyCode=27,keyText=Escape,keyChar=Escape,keyLocation=KEY_LOCATION_STANDARD,rawCode=27,primaryLevelUnicode=27,scancode=1,extendedKeyCode=0x1b] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=192,keyText=Back Quote,keyChar='`',keyLocation=KEY_LOCATION_STANDARD,rawCode=192,primaryLevelUnicode=96,scancode=41,extendedKeyCode=0xc0] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=9,keyText=Tab,keyChar=Tab,keyLocation=KEY_LOCATION_STANDARD,rawCode=9,primaryLevelUnicode=9,scancode=15,extendedKeyCode=0x9] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=20,keyText=Caps Lock,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=20,primaryLevelUnicode=0,scancode=58,extendedKeyCode=0x14] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=16,keyText=Shift,keyChar=Undefined keyChar,modifiers=Shift,extModifiers=Shift,keyLocation=KEY_LOCATION_LEFT,rawCode=16,primaryLevelUnicode=0,scancode=42,extendedKeyCode=0x10] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=17,keyText=Ctrl,keyChar=Undefined keyChar,modifiers=Ctrl,extModifiers=Ctrl,keyLocation=KEY_LOCATION_LEFT,rawCode=17,primaryLevelUnicode=0,scancode=29,extendedKeyCode=0x11] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=524,keyText=Windows,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_LEFT,rawCode=91,primaryLevelUnicode=0,scancode=91,extendedKeyCode=0x20c] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=18,keyText=Alt,keyChar=Undefined keyChar,modifiers=Alt,extModifiers=Alt,keyLocation=KEY_LOCATION_LEFT,rawCode=18,primaryLevelUnicode=0,scancode=56,extendedKeyCode=0x12] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=32,keyText=Space,keyChar=' ',keyLocation=KEY_LOCATION_STANDARD,rawCode=32,primaryLevelUnicode=32,scancode=57,extendedKeyCode=0x20] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=18,keyText=Alt,keyChar=Undefined keyChar,modifiers=Alt,extModifiers=Alt,keyLocation=KEY_LOCATION_RIGHT,rawCode=18,primaryLevelUnicode=0,scancode=56,extendedKeyCode=0x12] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=17,keyText=Ctrl,keyChar=Undefined keyChar,modifiers=Ctrl,extModifiers=Ctrl,keyLocation=KEY_LOCATION_RIGHT,rawCode=17,primaryLevelUnicode=0,scancode=29,extendedKeyCode=0x11] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=37,keyText=Left,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=37,primaryLevelUnicode=0,scancode=75,extendedKeyCode=0x25] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=16,keyText=Shift,keyChar=Undefined keyChar,modifiers=Shift,extModifiers=Shift,keyLocation=KEY_LOCATION_RIGHT,rawCode=16,primaryLevelUnicode=0,scancode=42,extendedKeyCode=0x10] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=38,keyText=Up,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=38,primaryLevelUnicode=0,scancode=72,extendedKeyCode=0x26] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=39,keyText=Right,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=39,primaryLevelUnicode=0,scancode=77,extendedKeyCode=0x27] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=96,keyText=NumPad-0,keyChar='0',keyLocation=KEY_LOCATION_NUMPAD,rawCode=96,primaryLevelUnicode=48,scancode=82,extendedKeyCode=0x60] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=110,keyText=NumPad .,keyChar='.',keyLocation=KEY_LOCATION_NUMPAD,rawCode=110,primaryLevelUnicode=46,scancode=83,extendedKeyCode=0x6e] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=10,keyText=Enter,keyChar=Enter,keyLocation=KEY_LOCATION_NUMPAD,rawCode=13,primaryLevelUnicode=13,scancode=28,extendedKeyCode=0xa] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=107,keyText=NumPad +,keyChar='+',keyLocation=KEY_LOCATION_NUMPAD,rawCode=107,primaryLevelUnicode=43,scancode=78,extendedKeyCode=0x6b] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=109,keyText=NumPad -,keyChar='-',keyLocation=KEY_LOCATION_NUMPAD,rawCode=109,primaryLevelUnicode=45,scancode=74,extendedKeyCode=0x6d] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=106,keyText=NumPad *,keyChar='*',keyLocation=KEY_LOCATION_NUMPAD,rawCode=106,primaryLevelUnicode=42,scancode=55,extendedKeyCode=0x6a] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=34,keyText=Page Down,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=34,primaryLevelUnicode=0,scancode=81,extendedKeyCode=0x22] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=33,keyText=Page Up,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=33,primaryLevelUnicode=0,scancode=73,extendedKeyCode=0x21] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=35,keyText=End,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=35,primaryLevelUnicode=0,scancode=79,extendedKeyCode=0x23] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=36,keyText=Home,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=36,primaryLevelUnicode=0,scancode=71,extendedKeyCode=0x24] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=127,keyText=Delete,keyChar=Delete,keyLocation=KEY_LOCATION_STANDARD,rawCode=46,primaryLevelUnicode=0,scancode=83,extendedKeyCode=0x7f] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=155,keyText=Insert,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=45,primaryLevelUnicode=0,scancode=82,extendedKeyCode=0x9b] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=123,keyText=F12,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=123,primaryLevelUnicode=0,scancode=88,extendedKeyCode=0x7b] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=122,keyText=F11,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=122,primaryLevelUnicode=0,scancode=87,extendedKeyCode=0x7a] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=121,keyText=F10,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=121,primaryLevelUnicode=0,scancode=68,extendedKeyCode=0x79] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=120,keyText=F9,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=120,primaryLevelUnicode=0,scancode=67,extendedKeyCode=0x78] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=119,keyText=F8,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=119,primaryLevelUnicode=0,scancode=66,extendedKeyCode=0x77] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=118,keyText=F7,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=118,primaryLevelUnicode=0,scancode=65,extendedKeyCode=0x76] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=117,keyText=F6,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=117,primaryLevelUnicode=0,scancode=64,extendedKeyCode=0x75] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=116,keyText=F5,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=116,primaryLevelUnicode=0,scancode=63,extendedKeyCode=0x74] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=115,keyText=F4,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=115,primaryLevelUnicode=0,scancode=62,extendedKeyCode=0x73] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=114,keyText=F3,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=114,primaryLevelUnicode=0,scancode=61,extendedKeyCode=0x72] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=113,keyText=F2,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=113,primaryLevelUnicode=0,scancode=60,extendedKeyCode=0x71] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=112,keyText=F1,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=112,primaryLevelUnicode=0,scancode=59,extendedKeyCode=0x70] on frame0

コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
デニス

11

HTML(Javascriptを使用)、46 31文字、46 31バイト

これを使用てテンキーの入力と戻り、LControlとRControlを区別します... apsillerがsignle関数呼び出しでそれを行う方法を見つけたので、もうありません。

<body onkeyup=alert(event.code)

特定の出力:

数字でまだ出力されるものはラップトップでテストできません。これらの
キーにアクセスできるようになるまでお待ちください

PrtScn-> PrintScreen
スクロールロック-> ScrollLock
一時停止->
左一時停止Shift-> ShiftLeft
右Shift-> ShiftRight
左Ctrl-> ContrlLeft
右Ctrl-> ControlRight
Caps Lock-> CapsLock Tab-
> Tab Enter-
> Enter
Enter on the number pad-> NumpadEnter
Num Lock- > NumLock Insert->数字パッドにInsを
挿入
-> Numpad0
Backspace-> Backspace Del-
> Delete
F1 ... F12- > F1 to F12 Esc-
> Escape
left Windows key-> MetaLeft
right Windowsキー-> MetaRight Alt-
> AltLeft AltGr-
> AltRight(バグのようなもので、ControlLeftを検出してからAltRightを検出し、しかし、それは確かにAltRightです)
アプリケーションキー(コンテキストメニュー)-> ContextMenu

編集: Lil 'BitsとETHproductionsのおかげでfunc呼び出し後に18バイトが保存さ
れた;後、1バイトが保存されました

RogerSpielkerのおかげで32バイトが節約されました。そして再び-2バイト:onkeydown- > onkeyup
1バイトの保存:最後のスラッシュの必要は
2つのバイトがCraigAyreのおかげで保存されていない:with()機能を
2つのバイトはASCIIのみのおかげで保存された:keyの代わりにはwhich
4つのバイトが保存され、我々はテキストを持っているので、必要がありません、以下のために'-'+これ以上のシンボルクローズ:1つのバイトはASCIIのみ(再び)のおかげで保存されません(すべての識別子は、この無しユニークである)> 私の答えの上部に言ったように15のバイトは、apsillersのおかげで保存されました。

<body onkeyup=alert(event.code)


待って...どうして... Caps Lock ...が検出されましたか?私はそれは不可能だと思った...ええと、まあ。PrtScnとSysRqは私には機能しませんが、私はこれらの2つのキーにFn + EndとFn + Homeを使用する小さなキーボードを備えたラップトップを使用しています。
ETHproductions

私はこの答えが好きですが、いくつかの問題があるようです。Tabでテストしても何も報告されませんcodepen.io/anon/pen/MoLPQMで。また、F12、PrtScnは、「受信したキーの押下から他のアクションを実行してはならず、一意の識別子以外は何も出力してはいけません」というルールに従いません。

HTMLを使用する@Lembikでは、システムがキーを使用するのを防ぐことは実際には不可能です。マシン(またはシステム)の有効な言語(Cなど)でキー入力を認識しないようにする必要があります。また、タブについては、動作するための条件がわかりません(つまり、動作する場合と動作しない場合があります。私の答えがトラバースキーをどのように処理するかわかりません)。
V. Courtois

@Lembikスタンドアロン(スニペットやフィドルなど)ではなく、フルスクリーンページ(F11など)でコードを表示すると、タブがキャプチャされます。タブをキャプチャしないという事実は、より大きなブラウザ環境の状態の関数であり、ページで実行されるコードではありません。デフォルトの動作を防止するためとして、<body onkeydown=return!!alert(event.code)>返すことによって、トリックを行う必要がありますfalsekeydown
apsillers

8

Tcl / Tk、22文字

bind . <Key> {puts %K}

サンプル実行:

keys identified by Tcl/Tk

ノート:

  • キーボードに適切なWindowsキーがない☹(賢い設計者がバックライトスイッチをその場所に置いた)
  • テンキーの挿入は、NumLockのステータスに基づいて異なるコードを生成します
  • ボリュームノブはX.org固有のコードを生成し、その他はすべて通常のキーシムです

6

X.orgでのBash、21バイト

xev|awk 'NR%2&&/\(k/'

残念ながら、Linux上でMacBookを使用しているため、テストできません。PrntScrも数字キーボードもありません。

xevは、マウスとキーボードのイベントをの下に出力するツールですX.org。私はそれをawkにパイプし、偶数行をフィルタリングし(キーが押されたときにすべてのキーが表示され、その後リリースされると)、含む(k文字のみを選択します-この文字列は押されたキーを記述するすべての行にあります。


質問に記載されている出力例を追加してください。

1
@Lembik終了後にすべての出力が表示されます。
-eneil

あ。それは仕様が求めるものではありません。今からそれをクリアします。

これにより、構文エラーが発生します。

3
LinuxはX11を意味しないことに注意してください。たとえば、これはテキストコンソール(showkey -sそこで使用:P)または純粋なWayland GUIデスクトップでは機能しません。これは本当にbash + Xorgの答えです。
ピーターコーデス

5

CとWin32、240の 224 216 205 202 194 191バイト

#include<d3d.h>
#include<stdio.h>
w[9];p(x,y,a,b){printf("%X",a^b);}main(){w[1]=p;w[9]=p;CreateWindow(RegisterClass(w),0,1<<28,0,0,0,0,0,0,0,0);for(;GetMessage(w,0,16,0);)DispatchMessage(w);}

出力

TABF0008C00F0008

PAUSE450012C0450012

ENTER1C000CC01C000C

NUMPAD-ENTER11C000CC11C000C

WINDOWS-LEFT15B005AC15B005A

WINDOWS-RIGHT15C005DC15C005D

INSERT152002CC152002C

NUMPAD-INSERT52002CC052002C

説明

#include <d3d.h> // shortest built-in header that includes windows.h
#include <stdio.h> // for printf

w[9]; // space for wndclass-data array

// function castable to the signature of WNDPROC
p(x,y,a,b)
{
    // key and state are encoded in the last two 4-byte arguments to wndproc
    printf("%X",a^b);
}

main(m)
{
    // set minimal window class equivalent data pointing to wndproc above
    w[1]=p;w[9]=p;

    // create the window using the class, with WS_VISIBLE flag
    CreateWindow(RegisterClass(w),0,1<<28,0,0,0,0,0,0,0,0)
    for(;GetMessage(w,0,16,0);) // filter messages 15 and lower, which fire without input
        DispatchMessage(w);
}

編集

-16 @ugorenに感謝

-8:変更WNDCLASSint 10個のメンバーすべてが4バイトであるため配列に

-11:wndclass-data配列の部分的な初期化、9要素に削減

-3:intwndclass-data配列に暗黙の宣言を使用

-8:出力形式から改行を削除します(specでは不要で、printfは改行なしですぐにフラッシュします)。戻り値を使用RegisterClassしてCreateWindowargに移動しますATOMます。m有効な文字列であるためにゼロバイトが必要なwndclass名を設定します。

-3:データにw変数を再利用MSG


coutを使用してC ++で同じことをするのはそれほど短くないでしょうか?
-onurcanbektas

@Leth No. <iostream>+ std::cout<<a^b<<"\n"は長くなります。さらに、戻り値の型を関数declsに追加する必要があると思いますmが、暗黙的にはできませんint
MooseBoys

で文字を保存するfor(;GetMessage(&m,0,16,0);)DispatchMessage(&m);
-ugoren

また、p(x,y,a,b)および(void*)pいくつかを保存する必要があります。
-ugoren

3

Java(OpenJDK 8)、369バイト

import java.awt.event.*;import javax.swing.*;class F{public static void main(String[] a){JFrame f=new JFrame();f.addKeyListener(new KeyListener(){public void keyPressed(KeyEvent e){System.out.print(e.getKeyCode()*8+e.getKeyLocation());}public void keyTyped(KeyEvent e){}public void keyReleased(KeyEvent e){}});f.setVisible(true);f.setFocusTraversalKeysEnabled(false);}}

これは、グラフィカルインターフェイスを使用するため、TIOで実行できませんが、コンピューター上では動作します。

一時停止:153
入力:81
NumPadで入力:84
左のスーパーキー:193(デスクトップのメニューショートカットを無効にした後)
右スーパーキー:201
挿入:241
Numpadに挿入:522948(私は持っていませんが、Numロックをオフにして5を押すと、それが得られます。Numロックがオンの場合、812になります。)

未ゴルフ/説明:

import java.awt.event.*; // KeyListener, KeyEvent
import javax.swing.*; // JFrame

class F implements KeyListener {

    public static void main(String[] a) {
        JFrame f=new JFrame(); // creates a new GUI frame
        f.addKeyListener(new KeyListener() {  // puts a KeyListener in the frame with the following properties:

            // Method that runs whenever a key is pressed
            public void keyPressed(KeyEvent e) {
                // getKeyCode returns an integer that uniquely identifies the key,
                // but not the location (e.g. LShift and RShift have the same key code)
                // To fix this, I scale up the key code by 8 and add the location,
                // which is always 0-4 (Standard, Left, Right, NumPad, or Unknown)
                // I could have scaled by 5 instead but I wasn't really thinking
                System.out.print(e.getKeyCode() * 8 + e.getKeyLocation());
                // If you want nicer-looking output, just change "print" to "println"
            }

            // Method that runs whenever a printable character is typed (does nothing)
            public void keyTyped(KeyEvent e){}

            // Method that runs whenever a keyboard key is released (does nothing)
            public void keyReleased(KeyEvent e){}
        });

        f.setVisible(true); // the frame will only except key presses if it is visible
        f.setFocusTraversalKeysEnabled(false); // disables "focus traversal" keys (such as Tab) from actually traversing focus
    }
}

タブキーで動作するように見えませんか?
ポケ

setFocusTraversalKeysEnabled(false);あなたの答えはこれを修正します。
魔法のタコUr

@MagicOctopusUrn私はそれが何をするのかわからないし、私はしたくないと思う:P
musicman523

回答がTABキーに対して機能するのは、回答がないと無効になるためです。
魔法のタコUr

なるほど-タブは「フォーカストラバーサルキー」です
-musicman523

3

Scala 2.10以降、279文字、279バイト

今、これはscalaの応答です:) Javaをやっているような気がしますが。とにかく、TIOでテストすることはできません。

import scala.swing._
import java.awt.event._
object M extends SimpleSwingApplication{def top=new MainFrame{this.peer.addKeyListener(new KeyListener(){def keyPressed(e:KeyEvent){print(e.getKeyCode+"-"+e.getKeyLocation)}
def keyReleased(e:KeyEvent){}
def keyTyped(e:KeyEvent){}})}}

使用しない場合でも、継承されたすべてのメソッドを宣言する必要があるのは残念です。一部のコンパイラフラグでは宣言しないことを許可できるため、バイトカウントから削除できますか。

これは(私のhtml-js応答に関して)keyPressed、「-」、そしてその「location」を出力します。

例えば ​​:

PrtScn->検証不可
Scroll Lock- > 145-1 Pause-
> 19-1
left Shift-> 16-2
right Shift-> 16-3
left Ctrl-> 17-2
right Ctrl-> 17-3
Caps Lock-> 20-1
タブ->検証不可Enter-
> 10-1 テンキーで入力
-> 10-4
Num
Lock- > 144-4 Insert-> 96-1
数字パッド上のアドイン- > 96-4
Backspaceキー- > 8-1
デル- > 127-1
F1 ... F12 - > 112-1 123-1に
Escキー- > 27-1は、
Windowsキーを左- > 524-2
右Windowsキー- > 524から3
Altキー- > 18- 2
AltGr-> 18-3(バギーの種類、17-2、18-3を検出し、確かに18-3)
アプリケーションキー(コンテキストメニュー)-> 525-1

私はそれがコンピュータに依存すると思うけれども:/私は今アゼルバイジャンのラップトップにいます。


不要な宣言をカウントしない場合は、非標準のコンパイラフラグの長さを含める必要があります。古いコンパイラがそれをデフォルトに使用していなかったら?-std=c89最新のコンパイラはデフォルトでc99またはc11 であるため、Cの回答は通常コンパイルする必要がありますが、カウントする必要はありません。だから私は判決がcode-golfメタから何になるのか分からない。
ピーターコーデス

3

TI-BASIC、19バイト

プログラム:S

If Ans
Disp Ans
getKey
prgmS
  • 入力:105、
  • 左キー:24、
  • 右キー:26、
  • Ins [ert]は、通常2回キーを押す必要がありますが、21の後に23が続くため、少し異なります。

残りのキーの図を次に示します。

ここに画像の説明を入力してください

説明:

PROGRAM:S エディターは、コードとは別に上部に名前を表示します。名前は「S」です

If Ans    // If the last input isn't zero
Disp Ans  // Display the last input
getKey    // Input a key press
prgmS     // Call the same program in a recursive fashion

残念ながら、これはArnold Cで行うことができないため、TI-BASICに固執する必要がありました。


1
その写真のすべてのキーで機能しますか?そうでない場合、どのキーが失敗しますか?

2
はい、オンボタンを除くすべてのキーで動作します。電卓からバッテリーを取り出さずにプログラムを強制終了するために予約されています。
bearacuda13

@ bearacuda13:18年前に購入した同等の計算機があり、何年もの間ONキーの詳細を知りませんでした。私は大学の終わり(11年前)からそれを使用していましたが、誰が知っている
...-sergiol

1

C#、144 + 601 = 745バイト

2つのクラスで構成されているため、それらを1つのクラスにうまくまとめることができませんでした。

メインクラス:

namespace System.Windows.Forms{class P:Form{static void Main(){Application.Run(new P());}P(){new Reflection.M().U+=k=>Console.Write(k.f+k.v);}}}

フッククラス:

namespace System.Reflection{using Runtime.InteropServices;public class M{public delegate void d(s s);event d u;public event d U{add{if(h<1){j=m;h=SetWindowsHookEx(13,j,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);}u+=value;}remove{u-=value;}}public struct s{public int v;public int c;public int f;}[DllImport("user32.dll")]static extern int SetWindowsHookEx(int idHook,p lpfn,IntPtr hMod,int dwThreadId);delegate int p(int c,int w,IntPtr l);p j;int h;int m(int c,int w,IntPtr l){if(c>=0&u!=null&(w==257|w==261))u.Invoke((s)Marshal.PtrToStructure(l,typeof(s)));return -1;}}}

出力:

  • タブ: 137
  • 一時停止: 147
  • 入る: 141
  • NumPad Enter: 142
  • 左ウィンドウ: 220
  • 右のウィンドウ: 221
  • インサート: 174
  • NumPad挿入: 224

他の同様のゴルフに変更||することでバイトを少し|減らすことができますが、それをした後、私の脳は休息が必要です!
TheLethalCoder

フッククラスでは、次のようpublic int v;public int c;public int f;に短縮できると思いますpublic int v,c,f;
疑問符

@QuestionMarks良いアイデアは、私がコンピューターに戻ったときにゴルフをする
TheLethalCoder

1

AutoHotkey、26バイト

loop{
input,x,L1M
send %x%
}

テストできない(win-only)が、Mオプションには

M:Control-AからControl-Zなどの変更されたキーストロークは、実際のASCII文字に対応する場合に認識され、書き起こされます。

それでうまくいくはずです。


1

WinApi C(gcc)、156バイト

#include <d3d.h>
#define b GetStdHandle(-10)
BYTE i[20];main(){SetConsoleMode(b,0);a:ReadConsoleInput(b,i,1,i+5);*i^1||*(i+4)||printf("%X\n",i[10]);goto a;}

このプログラムは、入力の各キーボードキーに関連付けられたWindows仮想キーコードを出力します。\nprintfフォーマットストリングは任意である(しかし、人に優しい出力を行う)との合計スコアのためにドロップすることができる154バイト。(taskmgrなしで)プログラムを終了する簡単な方法は、CTRL + PAUSEです。Fnキーを備えたキーボードを使用している場合、このプログラムはWindowsによっても認識されないため、それを取得できません。

  • アレイの#include <d3d.h>トリックとインスピレーションに対するMooseBoysの回答に感謝しBYTEます。

ローカル変数、読みやすさ、およびコンパイラ警告なしのプログラムは次のようになります。

#include <windows.h>
#include <stdio.h>

int main(void)
{
    HANDLE conIn = GetStdHandle(STD_INPUT_HANDLE);
    INPUT_RECORD ir;
    DWORD useless;

    SetConsoleMode(conIn, 0);

    for(;;)
    {
        ReadConsoleInput(conIn, &ir, 1, &useless);

        if(ir.EventType == KEY_EVENT && !ir.Event.KeyEvent.bKeyDown)
            printf("%X\n", ir.Event.KeyEvent.wVirtualKeyCode);
    }

    return 0;
}

1

C(gcc)+ Win32、94 95 98 105 107 110 バイト

#import"d3d.h"
j;f(){for(;;)for(j=191;j--;)GetAsyncKeyState(j)&(j<16||j>18)?printf("%d",j):0;}

コードは、フォーカスが失われた後でもキーをキャプチャします。

次のスクリーンショットはprintf("%d ",j);、読みやすくするために出力(+1バイト)の間にスペースを追加して記録されています。

キースクリーンショット

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

このコードはGetAsyncKeyState、通常、他のユーザーモードのアプローチ(DirectInputを除く)よりもリアルタイムで、メッセージキューをチェックせずにキーの状態を照会するために使用します。このアプローチは、キーロガーで広く使用されています。

(j<16||j>18)通常のCtrl / Alt / Shiftをフィルターします。16/17/18は、位置指定のvkey値とともに、左または右のボタンが押されるたびにトリガーされます。


1

PowerShell、34バイト

$Host.UI.RawUI.ReadKey().Character

入力と同じ行に出力されるため、少し混乱する可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.