我按了什么键?


15

任务是编写代码以识别在键盘上按下了哪个键。您可以假设一次只按下一个键,并且使用标准的美国键盘布局。那是@超过2的布局。

您的代码应为每个按键输出唯一的标识符。这包括PrtScn,滚动锁定,暂停,左Shift,右Shift,左Ctrl,右Ctrl,大写锁定,Tab,Enter,在数字键盘上输入,数字锁定,插入,在数字键盘上的Ins,退格键,Del,F1 ... F12,Esc,左Windows键,右Windows键,Alt,AltGr,应用程序键(上下文菜单)等等。

您的代码应继续等待按键并输出其身份,直到被杀死为止。但是,一旦释放密钥,它应该输出标识符。它不应从收到的按键中执行任何其他操作,并且除了唯一标识符外,它不应输出任何东西。

在您的答案中,请显示以下键盘按键的代码输出内容:数字键盘上的Tab,暂停,Enter,Enter,数字键盘上的左Windows键,右Windows键,Ins和Ins。

如果您使用的键盘非常不同,那么挑战仍然是为键盘上的每个键输出不同的标识符。


1
在JS(无论如何是浏览器JS)中,无法检查是否按下了某些键(例如Caps Lock,Num Lock,Scroll Lock,PrtScn)。这是否意味着JS无法回答?
ETHproductions

2
@ETHproductions确实如此。向世界各地的JS爱好者致歉。

2
提供了5个答案后修改的要求(包括现在已删除的一个答案)。那不是很公平...
OlivierGrégoire17年

6
我不认为这是公平/有权请求输出上没有的许多键盘如Windows键等按键
Notts90是关闭codidact.org

1
@ Notts90它们不是美国标准键盘布局的一部分吗?upload.wikimedia.org/wikipedia/commons/thumb/5/51/…–

Answers:


22

x86机器代码,DOS可执行文件,29 * 28字节

FAE464D0E873FAE460D0E073F4D41005212192B402CD2188F2CD21EBE3

这是一个COM可执行文件MS-DOS,它需要一个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

我将程序分为两部分。

第一部分处理扫描代码的读取。扫描码是与每个键关联的数值。
请注意,这些是硬件代码,它们不依赖于操作系统或字符集。它们就像密钥的编码对(列,行)。
每个键都有一个扫描码,即使是在某些键盘上找到的那些非标准的怪异功能键(例如“ open calc”键)也是如此。
一些密钥具有多字节扫描代码,它们的前缀旨在通过仅查看字节序列来使流可解码。
因此,每个键都有其唯一的标识符,甚至包括CTRL,SHIFT,WinKeys等。

仅处理释放键时发送的“中断代码”,而忽略“生成代码”。
前者设置了较高的位(字节的第7位),因此很容易识别它们。

第二部分处理字节的打印。
组装时打印总是很长,我们没有内置功能。
为了简短起见,并且由于需要写密钥的标识符,因此我放弃了十进制或十六进制数字,而倾向于使用个人编码。

字节xy,其中x是高半字节,y是低半字节,被打印为两个连续的字符c 0和c 1,定义为:

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

请注意,下半字节已打印 首先(这使我免于交换)。
基本原理是将半字节的16个可能值中的每个映射为从“!”开始的连续ASCII字符。
简单地说,这是一个十六进制数字,但带有

  1. 零食交换
  2. !"#$%&'()*+,-./01 作为数字(als)而不是 0123456789abcdef

DOSBox中运行它并按一些随机键(其中一些是特殊键,但请注意,作为Windows进程,DOSBox无法捕获所有键)会产生

DOSBox运行密钥标识符

请注意,该程序永远不会终止(进一步,它通过禁用中断来完全控制PC),正如我所希望的那样(根本没有杀死DOS中的进程)。


*减少对CodyGray的感谢。


使用该IN指令计算得出的字节数是否小于调用ROM BIOS中断(例如int 16h,功能10h)?
科迪(Cody Gray)

@CodyGray最有可能的是,可以跳过整个循环。我不知何故直接跳到in指令上。这实际上是一个很好的观点。如果还没有,为什么不发布它作为答案?:)
玛格丽特·布鲁姆

1
好吧,你现在疯了!听起来不只是评论现有答案,还需要做更多的工作。:-p我在玩东西。不过,有趣的提示是:在代码打高尔夫球时,xchg将累加器作为寄存器之一是1个字节,因此比2个字节要好mov
科迪·格雷

1
好的,问题int 16h是我没有获得Shift键,滚动锁或暂停/中断(也许还有其他)的扫描代码,而这是挑战所必需的。尽管从我看来,您的解决方案可以直接从I / O读取输入,但对于Ins / Del / Home / End / PgUp / PgDown群集中的所有键,它返回的值都相同。
科迪·格雷

1
@PeterCordes:PAUSE也有一些奇怪的行为,IIUC在按键时发送中断代码和make代码,而在按键释放时不发送任何内容。或那是我从PC游戏编程百科全书中了解到的。
ninjalj

12

Java 7或更高版本,246228字节

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<0以及import 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 ...不再如此,因为apsillers找到了一种使用信号函数调用的方法。

<body onkeyup=alert(event.code)

具体输出:

我无法在笔记本电脑上进行测试的结果仍然是数字
请等待我访问这些键

PrtScn-> PrintScreen
滚动锁定->滚动锁定
暂停->暂停
向左Shift-> ShiftLeft
右移Shift- > ShiftR 右
向左Ctrl-> ContrlLeft
右Ctrl- > ControlRight
Caps Lock- > CapsLock
选项卡-> Tab
输入->输入
输入数字pad-> NumpadEnter
Num Lock- > NumLock
插入->
在数字键盘上插入Ins-> Numpad0
退格-> Backspace Del-
>删除
F1 ... F12- > F1至F12 Esc-
>
左转Windows键-> MetaLeft
右Windows键-> MetaRight
Alt-> AltLeft AltGr-
> AltRight(有点越野车,它先检测ControlLeft,然后检测AltRight,但确实是AltRight)
应用程序密钥(上下文菜单)-> ContextMenu

编辑:函数调用后
节省了1个 字节由于Lil's Bits和ETHproductions而节省了18个字节,他们注意到我忘了缩短func和var名称。 感谢RogerSpielker,节省了32个字节。并再次-2个字节:-> 保存了1个字节:不需要最后的斜杠 CraigAyre节省了2个字节:函数 由于ASCII仅保存了2个字节:代替了 保存4个字节,因为我们有文本,所以不需要for (每个标识符都是唯一的,没有此标识符),由于仅使用ASCII(再次),因此节省了1个字节:不再有结束符号, 因为使用了apsiller,所以节省了15个字节,正如我的回答顶部所说。 ;

onkeydownonkeyup

with()
keywhich
'-'+>

<body onkeyup=alert(event.code)


等待...如何...大写锁定...被检测到?我以为那是不可能的...嗯,哦。PrtScn和SysRq对我不起作用,但是我在带小键盘的笔记本电脑上,这两个键盘使用Fn + End和Fn + Home。
ETHproductions '17

我喜欢这个答案,但似乎有一些问题。在codepen.io/anon/pen/MoLPQM上测试时,Tab不会为我报告任何内容。同样是F12,PrtScn也不遵循此规则“它不应从收到的按键中执行任何其他操作,并且除了唯一标识符外,它不应输出任何东西。”

@Lembik使用html,实际上不可能阻止系统使用该密钥。您需要强制它不使用机器(或系统)有效语言(例如C)来识别键输入。而对于标签,我不知道我的意思是什么条件的工作(,它的工作原理有时有有时没有,我不知道怎么我的答案对待穿越的钥匙。
五库尔图瓦

@Lembik如果您以独立屏幕(而不是片段,小提琴或类似形式)查看代码,则全屏页面(例如,使用F11)将捕获Tab。它不捕获选项卡的事实是较大的浏览器环境的状态的函数,而不是页面上运行的代码。至于防止默认行为,<body onkeydown=return!!alert(event.code)>应该通过以下方法来false解决:keydown
apsillers'apsillers'Jul

8

Tcl / Tk,22个字符

bind . <Key> {puts %K}

样品运行:

keys identified by Tcl/Tk

笔记:

  • 键盘上没有正确的Windows键key (聪明的设计师将背光灯开关放到了位)
  • 数字键盘的“插入”根据NumLock的状态生成不同的代码
  • 音量旋钮会生成X.org特定的代码,所有其他代码只是常规的按键符号

6

X.org的Bash,21个字节

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

不幸的是,由于我使用的是Linux上的MacBook,因此无法测试-没有PrntScr,没有数字键盘。

xev是一个输出鼠标和键盘事件的工具X.org。我将其通过管道传递给awk,过滤偶数行(因为在按下键时会显示每个键,然后在释放键时会显示每个键),然后仅选择包含这些(k键的行-该字符串在描述按下键的每一行中。


您能否添加问题中列出的示例输出。

1
@Lembik退出后出现所有输出。
埃德尼尔2016年

啊。这不是规范所要求的。我现在将清除这一点。

现在出现语法错误。

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:int对wndclass-data数组使用隐式decl

-8:从输出格式中删除换行符(spec并不需要,不需要立即刷新printf);移动RegisterClassCreateWindow精氨酸,使用返回ATOM; 设置wndclass名称m,只需要将其中的零字节作为有效字符串即可。

-3:将wvar 重用为MSG数据


通过使用cout在C ++中做相同的事情不会更短吗?
onurcanbektas

@Leth号<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
    }
}

看起来不适合Tab键吗?

setFocusTraversalKeysEnabled(false);您的答案将解决此问题。
魔术章鱼缸

@MagicOctopusUrn我不知道那是什么,我也不想这样做:P
musicman523 '17

它使您的答案适用于TAB键,因为没有它,您的答案将无效。
Magic Octopus Urn

哦,我明白了-Tab是“焦点遍历键”
musicman523 '17

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){}})}}

可悲的是,即使我们不使用它们,也需要声明所有继承的方法:l我可以将它们从字节数中删除吗,因为某些编译器标志可以不声明它们?

这将打印(就我的html-js响应而言)keyPressed,“-”和其“位置”。

例如 :

PrtScn->无法验证的
滚动锁定-> 145-1
暂停-> 19-1
左Shift-> 16-2
右Shift-> 16-3
左Ctrl-> 17-2
右Ctrl-> 17-3
Caps Lock-> 20-1
选项卡->不可验证
输入-> 10-1
在数字键盘上输入-> 10-4
数字锁定-> 144-4
插入-> 96-1
在数字键盘上的输入-> 96-4
退格键-> 8-1
Del-> 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

尽管我认为这取决于计算机://我现在正在使用azerty笔记本电脑。


如果不想计算不需要的声明,则可能必须包括非标准编译器标志的长度。除非以前的旧编译器默认使用默认设置?-std=c89由于现代编译器默认为c99或c11,因此通常需要使用C答案进行编译,但无需计算。所以我不确定代码高尔夫球元的裁定是什么。
彼得·科德斯

3

TI-BASIC,19个字节

程式

If Ans
Disp Ans
getKey
prgmS
  • 输入:105,
  • 左键:24,
  • 右键:26,
  • Ins [ert]稍有不同,因为通常需要两次按键才能到达,但是先按21后再按23。

这是其余键的说明:

enter image description here

说明:

程序: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 17-10-24

1

C#,144 + 601 = 745字节

由两个班级组成,我无法成功地将它们合并为一个班级。

主班:

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输入: 142
  • 左窗: 220
  • 右窗: 221
  • 插入: 174
  • 数字键盘插入: 224

我可以通过||选择|和其他类似的高尔夫球场来减少一些麻烦,但是这样做之后我的大脑需要休息!
TheLethalCoder

在胡克课堂上,我认为public int v;public int c;public int f;可以简化为public int v,c,f;
问号

@QuestionMarks当我回到电脑前,好主意会打高尔夫球
TheLethalCoder

1

自动热键,26字节

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

无法测试(仅获胜),但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甚至没有注意到它。

  • 归功于MooseBoys的#include <d3d.h>技巧和灵感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字节),以提高可读性:

key screenshot

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。只要按下左键或右键以及位置指定的vkey值,就会触发16/17/18。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.