मैंने किस कुंजी को दबाया?


15

कार्य कोड को यह पहचानने के लिए लिखना है कि कीबोर्ड पर किस कुंजी को दबाया गया है। आप मान सकते हैं कि एक समय में केवल एक कुंजी दबाया जाता है और एक मानक यूएस कीबोर्ड लेआउट होता है। यह @ ओवर 2 के साथ लेआउट है।

आपके कोड को किसी भी कुंजी के लिए एक विशिष्ट पहचानकर्ता का उत्पादन करना चाहिए। इसमें PrtScn, स्क्रॉल लॉक, पॉज, लेफ्ट शिफ्ट, राइट शिफ्ट, लेफ्ट Ctrl, राइट Ctrl, कैप्स लॉक, टैब, एंटर, नंबर पैड पर दर्ज करें, न्यूम लॉक, इंसर्ट, इन नम्बर पैड, बैकस्पेस, डेल, एफ 1 शामिल हैं। ... F12, Esc, Windows कुंजी, दाएँ Windows कुंजी, Alt, AltGr, अनुप्रयोग कुंजी (संदर्भ मेनू) और इसी तरह।

आपके कोड को कुंजी प्रेस की प्रतीक्षा करनी चाहिए और अपनी पहचान को तब तक आउटपुट करना चाहिए जब तक कि यह मारा न जाए। हालांकि एक कुंजी जारी होने के बाद इसे पहचानकर्ता को आउटपुट करना चाहिए। इसे प्राप्त होने वाले प्रमुख प्रेस से कोई अन्य कार्रवाई नहीं करनी चाहिए और यह अद्वितीय पहचानकर्ता के अलावा कुछ भी आउटपुट नहीं करना चाहिए।

अपने जवाब में, कृपया बताएं कि आप निम्नलिखित प्रमुख प्रेस के लिए क्या कोड आउटपुट देते हैं: टैब, पॉज़, एंटर, नंबर पैड पर दर्ज करें, विंडोज कुंजी, दाईं ओर विंडोज कुंजी, नंबर पैड पर इन्सर्ट और इन्स।

यदि आपके पास एक बहुत अलग कीबोर्ड है, तो चुनौती अभी भी आपके कीबोर्ड पर हर एक कुंजी के लिए एक अलग पहचानकर्ता का उत्पादन करने के लिए है।


1
जेएस (ब्राउज़र जेएस, वैसे भी) में, यह जांचना असंभव है कि कुछ कुंजी दबाए गए हैं (जैसे कैप्स लॉक, न्यूम लॉक, स्क्रॉल लॉक, प्रेटस्कैन)। इसका मतलब यह है कि जेएस जवाब नहीं दे सकता है?
ETHproductions

2
@ETHproductions यह वास्तव में करता है। हर जगह जेएस प्रेमियों को माफी।

2
5 उत्तरों के बाद संशोधित आवश्यकताएँ प्रदान की जाती हैं (अब हटाए गए सहित)। यह वास्तव में उचित नहीं है ...
ओलिवियर ग्रेजायर

6
मुझे नहीं लगता कि यह कुंजी के लिए आउटपुट का अनुरोध करने के लिए उचित / सही है जो कई कीबोर्ड पर नहीं हैं जैसे कि विंडोज कुंजी आदि
Notts90 कोड करने के लिए बंद है।

1
@ Notts90 क्या वे मानक यूएस कीबोर्ड लेआउट का हिस्सा नहीं हैं? upload.wikimedia.org/wikipedia/commons/thumb/5/51/...

जवाबों:


22

x86 मशीन कोड, DOS निष्पादन योग्य, 29 * 28 बाइट्स

FAE464D0E873FAE460D0E073F4D41005212192B402CD2188F2CD21EBE3

यह एमएस-डॉस के लिए एक COM निष्पादन योग्य है , इसके लिए एक आईबीएम पीसी संगत हार्डवेयर की आवश्यकता होती है । विशेष रूप से एक 8042 PS / 2 नियंत्रक या अधिक संभावना SMM के माध्यम से इसका अनुकरण

लंबी कहानी छोटी, यह किसी भी मुख्यधारा के पीसी में बॉक्स से बाहर काम करना चाहिए।

स्रोत कोड है

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

मैंने प्रोग्राम को दो भागों में विभाजित किया है।

पहला भाग स्कैन्कोड के पढ़ने से संबंधित है । स्कैनकोड्स हर कुंजी के साथ जुड़े संख्यात्मक मूल्य हैं।
ध्यान दें कि ये हार्डवेयर कोड हैं, वे ओएस या चारसेट पर निर्भर नहीं करते हैं। वे कुंजी की एक एन्कोडेड जोड़ी (कॉलम, पंक्ति) की तरह हैं।
हर कुंजी में एक स्केनकोड होता है, यहां तक ​​कि उन गैर-मानक अजीब फ़ंक्शन कुंजियों को कुछ कीबोर्ड पर पाया जाता है (जैसे "ओपन कैल्क" कुंजी)।
कुछ कुंजी में मल्टी-बाइट स्कैन्कोड है, वे उपसर्गों को केवल बाइट्स के अनुक्रम को देखते हुए धारा को डिकोडिजेबल बनाने के लिए डिज़ाइन किए गए हैं।
इसलिए प्रत्येक कुंजी को अपनी विशिष्ट पहचानकर्ता, यहां तक ​​कि CTRL, SHIFT, WinKeys और इसी तरह मिलती है।

केवल "ब्रेक कोड", एक कुंजी जारी होने पर भेजा जाता है, संसाधित किया जाता है, "कोड बनाएँ" पर ध्यान नहीं दिया जाता है।
फ़ॉर्मर्स में बिट (बाइट के लिए बिट 7) सेट होता है, इसलिए उन्हें पहचानना आसान होता है।

दूसरा भाग एक बाइट की छपाई से संबंधित है।
छपाई हमेशा विधानसभा में लंबी होती है, हमारे पास कोई भवन नहीं है।
इसे कम रखने के लिए, और चूंकि इसे कुंजी की पहचानकर्ता लिखना आवश्यक था , इसलिए मैंने व्यक्तिगत एन्कोडिंग के पक्ष में दशमलव या हेक्स अंकों को छोड़ दिया।

एक बाइट xy, x उच्च निबल और y कम लगातार दो वर्ण ग के रूप में मुद्रित किया जाता है 0 और सी 1 के रूप में परिभाषित:

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

ध्यान दें कि निचला निबल पहले मुद्रित होता है (यह मुझे एक स्वैप बख्शता है)।
तर्क यह है कि प्रत्येक ASCII वर्णों में '!' से एक कुलीन के 16 संभावित मूल्यों में से प्रत्येक को मैप करना है।
सीधे शब्दों में कहें, यह एक हेक्स संख्या है लेकिन साथ है

  1. निबल्स बदली
  2. !"#$%&'()*+,-./01 इसके बजाय अंक (एएल) के रूप में 0123456789abcdef

इसे DOSBox में चलाना और कुछ रैंडम की (कुछ जिनमें से एक विशेष कुंजी है, पर दबाएं) ध्यान दें कि Windows प्रक्रिया के रूप में DOSBox सभी कुंजियों को कैप्चर नहीं कर सकती है) पैदावार

DOSBox प्रमुख पहचानकर्ता चल रहा है

ध्यान दें कि यह कार्यक्रम कभी भी समाप्त नहीं होता है (आगे, यह व्यवधानों को अक्षम करके पीसी का पूर्ण नियंत्रण लेता है) जैसा कि मेरा मानना ​​है कि प्रश्न का उद्देश्य था (बस डॉस में प्रक्रियाओं की हत्या नहीं है)।


* CodyGray के लिए धन्यवाद कम ।


क्या INROM BIOS इंटरप्ट (जैसे int 16h, फ़ंक्शन 10h) को कॉल करने की तुलना में बाइट्स के संदर्भ में अनुदेश कार्य का उपयोग करना छोटा था ?
कोडी ग्रे

@CodyGray सबसे अधिक संभावना नहीं है, पूरे लूप को छोड़ दिया जा सकता है। किसी तरह मैं सीधे inनिर्देश पर कूद गया । यह वास्तव में आपके पास एक बहुत अच्छा बिंदु है। यदि आप पहले से ही नहीं है, तो इसे उत्तर के रूप में क्यों नहीं पोस्ट करें? :)
मार्गरेट ब्लूम

1
अच्छा अब तू पागल बोल रहा है! यह आपके मौजूदा उत्तर पर टिप्पणी करने की तुलना में बहुत अधिक काम करता है। : -पी मैं कुछ एक साथ डालने के साथ खेल रहा हूँ। फन टिप, यद्यपि: जब कोड गोल्फिंग, xchgएक रजिस्टर के रूप में संचायक के साथ 1 बाइट है, तो यह 2-बाइट से बेहतर है mov
कोडी ग्रे

1
ठीक है, समस्या int 16hयह है कि मुझे शिफ्ट कुंजी, स्क्रॉल लॉक, या पॉज़ / ब्रेक (शायद अन्य) के लिए स्कैन कोड नहीं मिलते हैं, और यह चुनौती के लिए आवश्यक है। I / O से सीधे इनपुट पढ़ने का आपका समाधान काम करता है, हालांकि यह मुझे ऐसा लगता है कि यह इनस / Del / Home / End / PgUp / PgDown क्लस्टर में सभी कुंजियों के लिए समान मान लौटाता है।
कोडी ग्रे

1
@PeterCordes: PAUSE के पास कुछ अजीब व्यवहार भी है, IIUC कुंजी कोड पर मेक कोड के साथ ब्रेक कोड भेज रहा है, और कुंजी रिलीज पर कुछ भी नहीं भेज रहा है। या यही मैंने पीसी गेम प्रोग्रामिंग इनसाइक्लोपीडिया से समझा।
निंजाल

12

जावा 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);}};}}

Ungolfed:

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 के लिए @ ओलिवियरग्रेयर के लिए धन्यवाद show(), 0<0औरimport java.awt.event.*;

जिसके परिणामस्वरूप:

यहां छवि विवरण दर्ज करें

यहां तक ​​कि पूंजीकृत पात्रों, खिड़कियों की चाबी, टोपी के ताले आदि के लिए शिफ्ट-प्रेस संभालती है ... आप इसे 'मॉडिफायर्स' को प्रिंट करते हुए भी देख सकते हैं, जो 'होल्ड कीज' हैं।

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 (जावास्क्रिप्ट के साथ), 46 31 वर्ण, 46 31 बाइट्स

यह दर्ज करने और वापसी करने के लिए सीमपैड को अलग करने के लिए उपयोग करते हुए , LControl और RControl ... अब नहीं है क्योंकि apsillers ने इसे साइनल फ़ंक्शन कॉल के साथ करने का एक तरीका पाया।

<body onkeyup=alert(event.code)

विशिष्ट आउटपुट:

उन लोगों के साथ जो भी हैं, मैं उन लोगों के साथ हूं, जिन्हें मैं अपने लोटपोट पर ध्यान दे सकता हूं,
जो मेरे लिए सही हैं।

PrtScn -> PrintScreen
स्क्रॉल लॉक -> स्क्रॉललॉक पोज़
->
बाईं ओर शिफ्ट करें -> ShiftLeft
दायाँ शिफ्ट -> ShiftRight
बाएँ Ctrl -> ContrlLeft
दाएँ Ctrl -> ControlRight
Caps Lock -> CapsLock
Tab -> Tab
Enter -> Enter
नंबर पर दर्ज करें। पैड -> NumpadEnter
Num Lock -> NumLock
Insert ->
इन्स को नंबर पैड पर डालें -> Numpad0
Backspace -> Backspace
Del -> Delete
F1 ... F12 -> F1 to F12
Esc -> एस्केप
विंडोज की -> MetaLeft
right Windows कुंजी -> मेटालाइट
Alt -> AltLeft अनुप्रयोग कुंजी (संदर्भ मेनू) -> संदर्भMenu
AltGr -> AltRight (छोटी गाड़ी की तरह, यह ControlLeft और फिर AltRight का पता लगाता है,लेकिन यह वास्तव में AltRight है)

EDITs:
1 बाइट फेक ;कॉल के बाद बचाई गई
18 बाइट्स ने लील के बिट्स और ETHproductions के लिए धन्यवाद बचाया, उन्होंने देखा कि मैं फंक और var नामों को छोटा करना भूल गया था।
32 बाइट्स ने RogerSpielker के लिए धन्यवाद बचाया, उन्होंने देखा कि मैं बिना किसी कारण के विरल कोड कर रहा था; और फिर से -2 बाइट्स: onkeydown-> onkeyup
1 बाइट बचाई: अंतिम स्लैश के लिए कोई ज़रूरत नहीं है
2 बाइट्स क्रेगएयर के लिए धन्यवाद बचाया: with()फ़ंक्शन
2 बाइट्स ने ASCII के लिए धन्यवाद बचाया - केवल 4 बाइट्स के keyस्थान पर which
बचाया गया, क्योंकि हमारे पास पाठ है, कोई ज़रूरत नहीं है के लिए '-'+(प्रत्येक पहचानकर्ता इसके बिना अद्वितीय है) 1 बाइट > ASCII- केवल (फिर से) के लिए धन्यवाद सहेजा गया: कोई और अधिक बंद करने वाला प्रतीक 15 बाइट्स ने अप्सिलर्स के लिए धन्यवाद नहीं बचाया, जैसा कि मेरे उत्तर के शीर्ष पर कहा गया है।

<body onkeyup=alert(event.code)


रुको ... कैसे है ... कैप्स लॉक ... का पता चला? मुझे लगा कि यह असंभव है ... हुह, ओह अच्छी तरह से। PrtScn और SysRq मेरे लिए काम नहीं करते हैं, लेकिन मैं एक छोटे कीबोर्ड के साथ एक लैपटॉप पर हूं जो उन दो कुंजियों के लिए Fn + End और Fn + Home का उपयोग करता है।
ETHproductions

मुझे यह उत्तर पसंद है लेकिन यह कुछ समस्याओं का है। जब मैं codepen.io/anon/pen/MoLPQM पर परीक्षण करता हूं तो टैब मेरे लिए कुछ भी रिपोर्ट नहीं करता है । इसके अलावा F12, PrtScn इस नियम का पालन नहीं करता है "इसे प्राप्त होने वाले प्रमुख प्रेस से कोई अन्य कार्रवाई नहीं करनी चाहिए और यह अद्वितीय पहचानकर्ता के अलावा कुछ भी आउटपुट नहीं करना चाहिए।"

@Lembik html का उपयोग करके, सिस्टम को कुंजी का उपयोग करने से रोकना वास्तव में संभव नहीं है। आपको एक मशीन (या सिस्टम) प्रभावी भाषा (जैसे सी शायद) के साथ प्रमुख इनपुट को नहीं पहचानने के लिए मजबूर करने की आवश्यकता है। और टैब के लिए, मुझे नहीं पता कि यह काम करने के लिए क्या स्थितियां हैं (मेरा मतलब है, यह कभी-कभी काम करता है और कभी-कभी ऐसा नहीं होता है। मुझे नहीं पता कि मेरा जवाब कैसे पता लगाने योग्य कुंजियों का इलाज करता है।
वी। कोर्टोइस

@ लेम्बिक यदि आप एक स्टैंडअलोन (स्निपेट या फिडल या समान) में कोड नहीं देखते हैं, फुलस्क्रीन पेज (जैसे, एफ 11 के साथ) तो यह टैब को पकड़ लेता है; तथ्य यह है कि यह टैब पर कब्जा नहीं करता है बड़े ब्राउज़र वातावरण की स्थिति का एक फ़ंक्शन है, न कि पृष्ठ पर चलाया जा रहा कोड। डिफ़ॉल्ट व्यवहार को रोकने के लिए के रूप में, <body onkeydown=return!!alert(event.code)>वापस लौट कर चाल करना चाहिए falseपरkeydown
apsillers

8

Tcl / Tk, 22 वर्ण

bind . <Key> {puts %K}

नमूना रन:

Tcl / Tk द्वारा पहचानी गई कुंजियाँ

टिप्पणियाँ:

  • मेरे कीबोर्ड पर कोई सही विंडोज कुंजी नहीं है ( चतुर डिजाइनर ने अपने स्थान पर बैकलाइट स्विच लगाया)
  • न्यूमेरिक पैड का इंसर्ट न्यूमॉक की स्थिति के आधार पर अलग कोड बनाता है
  • वॉल्यूम घुंडी X.org विशिष्ट कोड उत्पन्न करता है, अन्य सभी नियमित की- जिम हैं

6

X.org, 21 बाइट्स के साथ बैश करें

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

दुर्भाग्य से, मैं लिनक्स पर मैकबुक पर होने के बाद से इसका परीक्षण नहीं कर सकता - कोई PrntScr, कोई संख्यात्मक कीबोर्ड और सभी नहीं।

xevएक उपकरण है जो माउस और कीबोर्ड ईवेंट को आउटपुट करता है X.org। मैं इसे जागने के लिए पाइप करता हूं, यहां तक ​​कि लाइनों को फ़िल्टर करता हूं (क्योंकि हर कुंजी को तब दिखाया जाता है जब कुंजी दबाया जाता है, और फिर जब यह जारी होता है), और केवल उन लोगों का चयन करें (k- यह स्ट्रिंग प्रत्येक पंक्ति में है जो दबाए गए कुंजी का वर्णन करता है।


क्या आप प्रश्न में सूचीबद्ध उदाहरण आउटपुट जोड़ सकते हैं।

1
@ लिम्बिक सभी उत्पादन बाहर निकलने के बाद दिखाई देता है।
enedil

आह। वह नहीं है जो कल्पना के लिए पूछता है। मैं साफ कर दूंगा कि अभी।

यह अब एक सिंटैक्स त्रुटि देता है।

3
ध्यान दें कि लिनक्स X11 का अर्थ नहीं है। उदाहरण के लिए, यह पाठ कंसोल ( showkey -sवहां उपयोग करें : P), या शुद्ध वेन्डल GUI डेस्कटॉप पर काम नहीं करेगा । यह वास्तव में एक बाश + 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);}

आउटपुट

TAB: F0008C00F0008

PAUSE: 450012C0450012

ENTER: 1C000CC01C000C

NUMPAD-ENTER: 11C000CC11C000C

WINDOWS-LEFT: 15B005AC15B005A

WINDOWS-RIGHT: 15C005DC15C005D

INSERT: 152002CC152002C

NUMPAD-INSERT: 52002CC052002C

व्याख्या

#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 शुक्रिया @ यूगोरेन को

-8: बदल WNDCLASSकरने के लिए intसरणी के बाद से सभी 10 सदस्यों 4 बाइट हैं

-11: wndclass-data सरणी का आंशिक आरंभीकरण, 9 तत्वों तक कम

-3: intwndclass- डेटा ऐरे के लिए निहित घोषणा का उपयोग करें

-8: आउटपुट स्वरूप से नईलाइन हटाएं (बिना कल्पना में आवश्यक नहीं और इसके बिना तुरंत प्रिंट फ्लश); लौटे का उपयोग करते हुए, arg RegisterClassमें जाएं ; के लिए wndclass नाम सेट करेंCreateWindowATOMm जिसमें एक वैध स्ट्रिंग होने के लिए बस एक शून्य-बाइट की आवश्यकता है।

-3: डेटा के wलिए पुन: उपयोग varMSG


का उपयोग करके सी ++ के साथ ही बात कर अदालत बहुत कम नहीं हो सकता है?
onurcanbektas

@Leth No. <iostream>+ std::cout<<a^b<<"\n"अधिक लंबा है। इसके अलावा, मुझे लगता है कि आपको फ़ंक्शन के डिकल्स में वापसी प्रकार जोड़ना होगा, और mयह निहित नहीं हो सकता है int
मूसबॉयस

के साथ एक चार सहेजेंfor(;GetMessage(&m,0,16,0);)DispatchMessage(&m);
ugoren

इसके अलावा, p(x,y,a,b)और (void*)pकुछ को बचाना चाहिए।
'

3

जावा (ओपनजेडके 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 (मेरे पास एक नहीं है, लेकिन यही वह है जब आप 5 प्राप्त करते हैं जब आप 5 को Num lock off कर देते हैं। जब Num lock चालू होता है, तो आपको 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);आपके जवाब में यह ठीक हो जाएगा।
मैजिक ऑक्टोपस Urn

@MagicOctopusUrn मुझे नहीं पता कि वह क्या करता है और मुझे नहीं लगता कि मैं चाहता हूं: P
musicman523

यह आपके उत्तर को TAB कुंजी के लिए कार्य करता है, क्योंकि यह आपके उत्तर को इसके बिना अमान्य ठहराता है।
मैजिक ऑक्टोपस Urn

ओह्ह्ह्ह मैं देख रहा हूँ - टैब एक "फोकस ट्रैवर्सल की" है
संगीतकार ५२३

3

स्केला 2.10+, 279 चरस, 279 बाइट्स

अब यह एक प्रतिक्रिया है :) हालांकि यह महसूस करता है कि मैं जावा कर रहा हूं। वैसे भी हम टीआईओ पर इसका परीक्षण नहीं कर सकते।

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
बाईं शिफ्ट -> 16-2
राइट शिफ्ट -> 16-3
बाएं Ctrl -> 17-2
राइट Ctrl -> 17-3
कैप्स लॉक -> 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
बाएं विंडोज की -> 524-2
राइट विंडोज की -> 524-3
Alt -> 18- 2
AltGr -> 18-3 (छोटी गाड़ी की तरह, यह 17-2 का पता लगाता है और फिर 18-3 सेलेकिन यह वास्तव में 18-3 है)
आवेदन कुंजी (संदर्भ मेनू) -> 525-1

हालाँकि मुझे लगता है कि यह कंप्यूटर पर निर्भर करता है: / मैं अभी एक azerty लैपटॉप पर हूँ।


यदि आप अनावश्यक घोषणाओं की गिनती नहीं करना चाहते हैं, तो आपको गैर-मानक संकलक झंडे की लंबाई को शामिल करना पड़ सकता है। जब तक पुराने संकलक उस पर डिफ़ॉल्ट नहीं करते थे? C उत्तर आमतौर पर -std=c89आधुनिक संकलक के साथ संकलित करने की आवश्यकता है क्योंकि c99 या c11 के लिए डिफ़ॉल्ट है, लेकिन इसे गिनने की आवश्यकता नहीं है। इसलिए मुझे यकीन नहीं है कि कोड-गोल्फ मेटा से सत्तारूढ़ क्या होगा।
पीटर कॉर्डेस

3

TI-BASIC, 19 बाइट्स

कार्यक्रम: एस

If Ans
Disp Ans
getKey
prgmS
  • दर्ज करें: 105,
  • बाईं कुंजी: 24,
  • सही कुंजी: 26,
  • इन्स [ert] थोड़ा अलग है क्योंकि इसे प्राप्त करने के लिए सामान्य रूप से दो प्रमुख प्रेस होंगे, लेकिन 23 के बाद 21 हो जाएंगे।

यहाँ बाकी कुंजियों का चित्रण है:

यहां छवि विवरण दर्ज करें

स्पष्टीकरण:

कार्यक्रम: एस संपादक कोड के अलावा शीर्ष पर नाम प्रदर्शित करता है; नाम "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

यह, दुर्भाग्य से, अर्नोल्ड सी में करना संभव नहीं है, इसलिए मुझे टीआई-बेसिक से चिपकना पड़ा।


1
क्या यह उस चित्र में हर कुंजी के लिए काम करता है? यदि नहीं तो कौन सी कुंजी इसके लिए विफल है?

2
हां, यह ऑन बटन के अलावा हर कुंजी के लिए काम करता है, जो कैलकुलेटर से बाहर बैटरी पॉपिंग के बिना प्रोग्राम को मारने के लिए आरक्षित है।
बीरकुडा 13

@ bearacuda13: मेरे पास एक समान कैलकुलेटर है जिसे मैंने 18 साल पहले खरीदा था और वर्षों तक इसकी मुख्य जानकारी नहीं थी। मैं विश्वविद्यालय के अंत (11 साल पहले) के बाद से इसका इस्तेमाल कर रहा था, लेकिन कौन जानता है ...
सर्जियो

1

सी #, 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
  • NumPad डालें: 224

मैं और अन्य समान गोल्फों ||को बदलकर बाइट्स को थोड़ा कम कर सकता हूं |लेकिन ऐसा करने के बाद मेरे मस्तिष्क को आराम की आवश्यकता है!
द लीथेलकोडर

हुक क्लास में, मुझे लगता है कि 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: कंट्रोल-जेड के माध्यम से कंट्रोल-ए जैसे संशोधित कीस्ट्रोक्स को मान्यता दी जाती है और यदि वे वास्तविक 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;}

यह प्रोग्राम इनपुट के प्रत्येक कीबोर्ड कुंजी के साथ विंडोज वर्चुअल-की कोड को प्रिंट करता है। \nमें printfप्रारूप स्ट्रिंग वैकल्पिक है (लेकिन उत्पादन मानव के अनुकूल बनाता है) और के कुल स्कोर के लिए छोड़ा जा सकता है 154 बाइट्स । कार्यक्रम को मारने का एक आसान तरीका है (टास्कमग्र के बिना) CTRL + PAUSE। यदि आपके पास Fn कुंजी वाला कीबोर्ड है, तो यह प्रोग्राम इसे नहीं उठा सकता है क्योंकि यह विंडोज द्वारा भी नहीं देखा गया है।

  • #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

सी (जीसीसी) + विन 32, 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 को छोड़कर) की तुलना में अधिक वास्तविक समय होता है। इस दृष्टिकोण का उपयोग व्यापक रूप से keyloggers में किया जाता है।

(j<16||j>18)नियमित Ctrl / Alt / Shift फ़िल्टर करता है। जब भी बाएँ या दाएँ किसी को दबाया जाता है, तो 16/17/18 को ट्रिगर किया जाता है, साथ ही स्थान-निर्दिष्ट स्वर मूल्य।


1

पॉवरशेल, 34 बाइट्स

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

इनपुट के रूप में एक ही लाइन पर आउटपुट, जो एक उलझन भ्रामक हो सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.