инструмент командной строки для вывода введенного ключа

Мне нужен способ определить, когда пользователь нажимает клавиши со стрелками в пакетном файле Windows. Я думаю, что проще всего было бы использовать инструмент командной строки, который отображает десятичное значение любой нажатой клавиши и переходить оттуда. Было бы проще установить значение ключа непосредственно в пакетную переменную, но я могу сделать это без (через цикл FOR, чтобы установить вывод команды в переменную)

Единственное, что у меня есть, это использование кейлоггера и проверка файла журнала на наличие клавиш со стрелками, но это не работает, и мне не нравятся кейлоггеры (как и клиент).

вот пример того, как я могу его использовать:

for /f "tokens=1,2 delims=[]" %%A in ('foo.exe') do set input=%%B
:: the above justs sets the output of the command "foo.exe" the variable %input% 


if %input%==37 echo you pressed the left arrow key.
if %input%==38 echo you pressed the up arrow key.
if %input%==39 echo you pressed the right arrow key.
if %input%==40 echo you pressed the left arrow key.

поэтому мне просто нужна программа, в которой, когда я набираю какую-либо команду из командной строки, foo.exe, программа ждет, пока пользователь нажмет кнопку, и любая нажатая кнопка записывается и выводится в десятичной форме (код виртуальной клавиши и вы можете найти список здесь.), например этот 37 ( Ключ для левой кнопки мыши)


person coltonon    schedule 01.07.2014    source источник
comment
Пользователи не нажимают клавиши со стрелками в пакетных файлах. Консоли имеют два режима: высокий уровень, который представляет собой строки текста (клавиши со стрелками - это не текст) и как работают пакетные файлы, и низкий уровень. Ты можешь делать, что хочешь. Но вам нужно написать программу.   -  person Noodles    schedule 02.07.2014
comment
Я знаю это. Мне просто нужна программа, которая выдаст мне код виртуальной клавиши любой нажатой клавиши.   -  person coltonon    schedule 02.07.2014
comment
Какой сценарий оболочки (командный файл) вы пишете?   -  person Bill_Stewart    schedule 02.07.2014
comment
Действительно сложный и довольно бессмысленный :)   -  person coltonon    schedule 02.07.2014


Ответы (2)


Я уже писал такую ​​программу. Я назвал его GetKey.exe, но он возвращает код клавиши, нажатой через значение% errorlevel%, потому что это более эффективно, чем через команду for /F ... (которая требует каждый раз выполнять копию cmd.exe). Он считывает как обычные ключи (символы Ascii), так и расширенные ключи (например, клавиши со стрелками) и различает последние из них с помощью отрицательного значения уровня ошибки. Вы можете загрузить GetKey.exe с этого сайта, найдите программу №3.

Программа ниже (SHOWKEYCODES.BAT) отображает коды, возвращаемые GetKey для всех специальных клавиш на клавиатуре, включая комбинации Shift, Ctrl и Alt. Вы можете запустить эту программу и скопировать только те коды, которые вам нужны.

@echo off
setlocal EnableDelayedExpansion
(for /F "delims==" %%a in ('set') do (
   echo %%a
)) > vars.txt
call :DefineKeyCodes
set a=a
< vars.txt (
for /F "tokens=1* delims==" %%a in ('set') do (
   if "!a!" equ "%%a" (
      set /P a=
   ) else (
      echo %%a=%%b
   )
))
del vars.txt
goto :EOF


:DefineKeyCodes
rem Definition of key codes via key names
rem Antonio Perez Ayala

rem Require Delayed Expansion. Modify "i" variable.
rem Can not use Setlocal because its purpose is to create global variables

for %%a in ("BackSpace=8" "TabKey=9" "Ctrl_Enter=10" "EnterKey=13" "EscKey=27" "Ctrl_@=-3") do (
   set %%a
)
set i=-14
for %%a in (Alt_BackSpace Shift_Tab) do (
   set %%a=!i!
   set /A i-=1
)
rem Currently: i=-16
for %%a in (Q W E R T Y U I O P LeftBracket RightBracket) do (
   set Alt_%%a=!i!
   set /A i-=1
)
set i=-30
for %%a in (A S D F G H J K L Semicolon Apostrophe BackQuote) do (
   set Alt_%%a=!i!
   set /A i-=1
)
set i=-43
for %%a in (BackSlash Z X C V B N M Comma Dot Slash "" GrayStar) do (
   set Alt_%%~a=!i!
   set /A i-=1
)
set i=-59
for %%a in (F1 F2 F3 F4 F5 F6 F7 F8 F9 F10) do (
   set %%a=!i!
   set /A i-=1
)
set i=-71
for %%a in (HomeKey UpArrow PageUp Alt_GrayDash LeftArrow KeyPad5 RightArrow
            Alt_GrayPlus EndKey DownArrow PageDown InsKey DelKey) do (
   set %%a=!i!
   set /A i-=1
)
rem Currently: i=-84
for %%a in (Shift Ctrl Alt) do (
   for %%b in (F1 F2 F3 F4 F5 F6 F7 F8 F9 F10) DO (
      set %%a_%%b=!i!
      set /A i-=1
   )
)
rem Currently: i=-114
for %%a in (PrtSc LeftArrow RightArrow End PageDown Home) do (
   set Ctrl_%%a=!i!
   set /A i-=1
)
rem Currently: i=-120
for %%a in (1 2 3 4 5 6 7 8 9 0 Dash Equal) do (
   set Alt_%%a=!i!
   set /A i-=1
)
rem Currently: i=-132
for %%a in (Ctrl_PageUp F11 F12 Shift_F11 Shift_F12 Ctrl_F11 Ctrl_F12 Alt_F11 Alt_F12) do (
   set %%a=!i!
   set /A i-=1
)
rem Currently: i=-141
for %%a in (UpArrow GrayDash KeyPad5 GrayPlus DownArrow Ins Del Tab GraySlash GrayStar) do (
   set Ctrl_%%a=!i!
   set /A i-=1
)
rem Currently: i=-151
for %%a in (Home UpArrow PageUp "" LeftArrow KeyPad5 RightArrow "" End
            DownArrow PageDown Ins Del GraySlash) do (
   set Alt_%%~a=!i!
   set /A i-=1
)
set Alt_=
set i=

exit /B
person Aacini    schedule 02.07.2014

Если все, что вам нужно, это поймать клавиши со стрелками (и клавишу Enter), вы можете использовать getch.exe, который вы можете загрузить здесь.

Он возвращает свое значение переменной %errorlevel% в соответствии со следующей таблицей:

  • 0 для стрелки ВВЕРХ
  • 1 для стрелки ВНИЗ
  • 2 для стрелки ВПРАВО
  • 3 для ЛЕВОЙ стрелки
  • 4 для клавиши Enter
person jgodoy    schedule 22.12.2014
comment
Отлично. Я также нашел другую программу, которая делает то же самое, но со всеми ключами. - person coltonon; 18.07.2015