Задача состоит в том, чтобы написать код, чтобы определить, какая клавиша нажата на клавиатуре. Вы можете предположить, что одновременно нажимается только одна клавиша и существует стандартная раскладка клавиатуры США. Это макет с @ над 2.
Ваш код должен выводить уникальный идентификатор для любой нажатой клавиши. Это включает PrtScn, Scroll Lock, Pause, Shift влево, Shift вправо, Ctrl влево, Ctrl вправо, Caps Lock, Tab, Enter, Enter на цифровой клавиатуре, Num Lock, Вставка, Ins на цифровой клавиатуре, Backspace, Del, F1 ... F12, Esc, левая клавиша Windows, правая клавиша Windows, Alt, AltGr, клавиша приложения (контекстное меню) и так далее.
Ваш код должен продолжать ждать нажатия клавиш и выводить их идентификационные данные, пока он не будет уничтожен. Однако он должен вывести идентификатор, как только ключ будет выпущен. Он не должен выполнять никаких других действий от нажатий клавиш, которые он получает, и не должен выводить ничего, кроме уникального идентификатора.
В своем ответе, пожалуйста, покажите, какой код вы выводите для следующих нажатий клавиш: Tab, Pause, Enter, Enter на цифровой клавиатуре, левая клавиша Windows, правая клавиша Windows, Insert и Ins на цифровой клавиатуре.
Если у вас совсем другая клавиатура, задача по-прежнему состоит в том, чтобы вывести разные идентификаторы для каждой клавиши на клавиатуре.
Ответы:
машинный код x86, исполняемый файл DOS,
29* 28 байтЭто исполняемый файл COM для MS-DOS , для него требуется совместимое с IBM PC оборудование.
В частности, контроллер 8042 PS / 2 или, скорее, его эмуляция через SMM .
Короче говоря, он должен работать из коробки на любом обычном ПК.
Исходный код
Я разделил программу на две части.
Первая часть посвящена чтению скан-кодов . Скан-коды - это числовые значения, связанные с каждым ключом.
Обратите внимание, что это аппаратный код, он не зависит от ОС или кодировки. Они похожи на закодированную пару (столбец, строку) ключа.
Каждая клавиша имеет скан-код, даже те нестандартные странные функциональные клавиши, которые есть на некоторой клавиатуре (например, клавиша «открыть калькулятор»).
Некоторые ключи имеют многобайтовый скан-код, они имеют префиксы, разработанные для того, чтобы сделать поток декодируемым, просто взглянув на последовательность байтов.
Таким образом, каждый ключ получает свой уникальный идентификатор, даже CTRL, SHIFT, WinKeys и так далее.
Обрабатываются только «коды прерывания», отправленные при отпускании ключа, «коды создания» игнорируются.
У формирователей установлен старший бит (бит 7 для байта), поэтому их легко распознать.
Вторая часть посвящена печати байта.
Печать всегда длинна в сборке, у нас нет встроенных элементов.
Короче говоря, и поскольку требовалось написать идентификатор ключа, я отказался от десятичных или шестнадцатеричных чисел в пользу персональной кодировки.
Байт xy, где x - верхний полубайт, а y - нижний, выводится как два последовательных символа c 0 и c 1, определенных как:
c 0 = 0x21 + y
c 1 = 0x21 + x
Обратите внимание, что нижний полубайт печатается первым (это избавило меня от обмена).
Обоснование состоит в том, чтобы отобразить каждое из 16 возможных значений клева в последовательные символы ASCII из '!'.
Проще говоря, это шестнадцатеричное число, но с
!"#$%&'()*+,-./01
в виде цифры (als) вместо0123456789abcdef
Запуск его в DOSBox и нажатие некоторой случайной клавиши (некоторые из которых являются специальными клавишами, но обратите внимание, что DOSBox как процесс Windows не может захватить все клавиши) дает
Обратите внимание, что эта программа никогда не завершается (кроме того, она берет на себя полный контроль над ПК, отключая прерывания), как я полагаю, было задано вопросом (просто нет уничтожения процессов в DOS).
* Уменьшено благодаря CodyGray .
источник
IN
инструкции быть меньше в байтах, чем вызывать прерывания ПЗУ BIOS (напримерint 16h
, функция 10h)?in
инструкции. Это на самом деле очень хорошая точка зрения у вас есть. Если вы еще этого не сделали, почему бы не опубликовать его в качестве ответа? :)xchg
аккумулятор в качестве одного из регистров составляет 1 байт, так что это лучше, чем 2-байтовыйmov
.int 16h
том, что я не получаю коды сканирования для клавиш Shift, блокировки прокрутки или паузы / прерывания (возможно, других), и это требуется для вызова. Ваше решение чтения входных данных непосредственно из ввода-вывода работает, хотя мне кажется, что оно возвращает одинаковое значение для всех ключей в кластере Ins / Del / Home / End / PgUp / PgDown.Java 7 или выше,
246228 байтUngolfed:
-18 благодаря @ OlivierGrégoire для
show()
,0<0
иimport java.awt.event.*;
Что приводит к:
Даже обрабатывает нажатие клавиш Shift для заглавных букв, клавиши Windows, блокировки колпачков и т. Д. Вы можете видеть, что это также печатает «модификаторы», которые являются «удерживаемыми клавишами».
источник
HTML (с Javascript),
4631 символ,4631 байтИспользуя это для различения ввода и возврата с помощью numpad, LControl и RControl ... Уженет, поскольку апсиллеры нашли способ сделать это с помощью вызова функции signle.Конкретные результаты:
РЕЗУЛЬТАТЫ, КОТОРЫЕ ВСЕ ЕЩЕ С ЦИФРАМИ, Я НЕ МОГУ ТЕСТИРОВАТЬ НА МОЕЙ НОУТБУКЕ,
ПОЖАЛУЙСТА, ПОДОЖДИТЕ, ЧТОБЫ Я ДОСТУП К ЭТИМ КЛЮЧАМ
PrtScn -> PrintScreen
Scroll Lock -> ScrollLock
Pause -> Pause
влево Shift -> ShiftLeft
вправо Shift -> ShiftRight
влево Ctrl -> ContrlLeft
вправо Ctrl -> ControlRight
Caps Lock ->
вкладка CapsLock -> вкладка CapsLock -> вкладка
Enter -> Enter
введите число pad -> NumpadEnter
Num Lock -> NumLock
Вставить -> Вставить
модули на цифровой клавиатуре ->
Backspace Numpad0 -> Backspace
Del -> Удалить
F1 ... F12 -> От F1 до F12
Esc
-> Выход из левой клавиши Windows -> MetaLeft
right Клавиша Windows -> MetaRight
Alt -> AltLeft
AltGr -> AltRight (глючит, обнаруживает ControlLeft, а затем AltRight,но это действительно AltRight)
ключ приложения (контекстное меню) -> ContextMenu
РЕДАКТИРОВАТЬ:
1 байт сохранен
;
после вызова функции.18 байтов, сохраненных благодаря Lil 'Bits и ETHproductions, они заметили, что я забыл сократить имена функций и переменных.
32 байта сэкономлено благодаря RogerSpielker, он заметил, что я делал sparated код без причины; и снова -2 байта:
onkeydown
->onkeyup
1 байт сохранен: не требуется финальная косая черта
2 байта сохранены благодаря CraigAyre:
with()
функциясохранена 2 байта благодаря только ASCII:
key
вместоwhich
4 байтов сохранено, так как у нас есть текст, в этом нет необходимости for
'-'+
(каждый идентификатор уникален без этого) 1 байт сохранен благодаря ASCII-only (опять же): больше нет закрывающего символа,>
15 байт сохранено благодаря апсиллерам, как сказано в верхней части моего ответа.источник
<body onkeydown=return!!alert(event.code)>
должен сделать трюк, вернувfalse
наkeydown
Tcl / Tk, 22 символа
Образец прогона:
Примечания:
умныйдизайнер поставил переключатель подсветки на место)источник
Bash с X.org, 21 байт
К сожалению, я не могу проверить это, так как я на MacBook под Linux - нет PrntScr, нет цифровой клавиатуры и все такое.
xev
это инструмент, который выводит события мыши и клавиатуры подX.org
. Я передаю его в awk, фильтрую четные строки (поскольку каждая клавиша отображается при нажатии клавиши, а затем, когда она отпущена), и выбираю только те, которые содержат(k
- эта строка находится в каждой строке, которая описывает нажатую клавишу.источник
showkey -s
там: P) или на чистом рабочем столе Wayland GUI. Это действительно ответ bash + Xorg.C и Win32,
240224216205202194191 байтВыходы
TAB:
F0008C00F0008
PAUSE:
450012C0450012
ENTER:
1C000CC01C000C
NUMPAD-ENTER:
11C000CC11C000C
WINDOWS-LEFT:
15B005AC15B005A
WINDOWS-RIGHT:
15C005DC15C005D
INSERT:
152002CC152002C
NUMPAD-INSERT:
52002CC052002C
объяснение
Правки
-16 благодаря @ugoren
-8: изменено
WNDCLASS
наint
массив, так как все 10 членов имеют 4 байта-11: частичная инициализация массива wndclass-data, уменьшена до 9 элементов
-3: использовать неявный
int
decl для массива wndclass-data-8: удалить символ новой строки из выходного формата (не требуется в спецификациях и сбрасывает printf сразу без него); перейти
RegisterClass
вCreateWindow
arg, используя returnATOM
; установите имя wndclass,m
которому нужен только нулевой байт, чтобы быть допустимой строкой.-3: повторно использовать
w
var дляMSG
данныхисточник
<iostream>
+ Длиннееstd::cout<<a^b<<"\n"
. Кроме того, я думаю, что вам нужно добавить возвращаемые типы в функцию decls, и ониm
не могут быть неявнымиint
.for(;GetMessage(&m,0,16,0);)DispatchMessage(&m);
p(x,y,a,b)
и(void*)p
стоит сэкономить.Java (OpenJDK 8) , 369 байт
Это не может быть выполнено с TIO, потому что он использует графический интерфейс, но он работает на моем компьютере.
Ungolfed / Объяснение:
источник
setFocusTraversalKeysEnabled(false);
в вашем ответе это исправят.Scala 2.10+, 279 символов, 279 байтов
Теперь это ответ scala :), хотя я чувствую, что я делаю Java. Во всяком случае, мы не можем проверить это на TIO.
Печально, что нам нужно объявлять все унаследованные методы, даже если мы их не используем: я могу удалить их из числа байтов, так как некоторые флаги компилятора могут разрешить не объявлять их?
Это печатает (как для моего ответа html-js) нажатую клавишу «-», а затем его «местоположение».
Например :
PrtScn -> не проверяемый
Scroll Lock -> 145-1
Пауза -> 19-1
Shift влево -> 16-2
Shift вправо -> 16-3
влево Ctrl -> 17-2
вправо Ctrl -> 17-3
Caps Lock ->
Вкладка 20-1 -> невозможно проверить
Ввод -> 10-1
Ввести на цифровой клавиатуре -> 10-4
Num Lock -> 144-4
Вставить -> 96-1 Ввод
на цифровой клавиатуре -> 96-4
Backspace -> 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
Хотя я думаю, что это зависит от компьютера: / Я сейчас на ноутбуке с азертами.
источник
-std=c89
поскольку современные компиляторы по умолчанию используют c99 или c11, но не нужно это считать. Так что я не уверен, что решение будет из мета-кода гольф.TI-BASIC, 19 байтов
Вот иллюстрация остальных клавиш:
Объяснение:
К сожалению, это невозможно сделать в Arnold C, поэтому мне пришлось придерживаться TI-BASIC.
источник
C #, 144 + 601 = 745 байт
Состоит из двух классов, мне не удалось успешно объединить их в один класс.
Основной класс:
Крюк класс:
Выходы:
137
147
141
142
220
221
174
224
источник
||
на|
другие подобные игры, но мой мозг нуждается в отдыхе после этого!public int v;public int c;public int f;
можно сократить доpublic int v,c,f;
AutoHotkey , 26 байт
Не могу проверить (только для побед), но
M
опция говоритТак что должно быть хорошо.
источник
WinApi C ( gcc ), 156 байт
Эта программа печатает код виртуальной клавиши Windows, связанный с каждой клавишей ввода.
\n
Вprintf
формате струне не является обязательным (но делает выход человека дружественным) и может быть отброшены на общий балл 154 байт . Простой способ убить программу (без taskmgr) - с помощьюCTRL + PAUSE
. Если у вас есть клавиатура с клавишей Fn, эта программа не сможет ее поднять, так как она даже не замечена Windows.#include <d3d.h>
трюк и вдохновение дляBYTE
массива.Программа с локальными переменными, удобочитаемостью и без предупреждений компилятора выглядит следующим образом:
источник
C (gcc) + Win32, 94
9598105107110байтовКод захватывает ключи даже после потери фокуса.
Следующие снимки экрана записаны с добавлением пробелов между выходами (
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, указанным в местоположении.источник
PowerShell, 34 байта
Выходы в той же строке, что и вход, что может немного запутать.
источник