命令行工具来回显输入键

时间:2014-07-01 23:34:12

标签: batch-file keystroke command-line-tool

我需要一种方法来检测用户何时按下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输入一些命令时,程序等待用户按下按钮,按下任何按钮,都会被记录并在其中输出&# 39; s十进制格式(虚拟键码,你可以查找列表here.),如37(鼠标左键)

2 个答案:

答案 0 :(得分:1)

我已经写了这样一个程序。我将其称为GetKey.exe,但它返回通过%errorlevel%值按下的键的键代码,因为它比通过for /F ...命令(需要执行cmd.exe的副本)更有效率时间)。它读取普通键(Ascii字符)和扩展键(如箭头键),并用负误差级别值区分这些最后一个键。您可以从this site下载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

答案 1 :(得分:1)

如果您只需要捕捉箭头键(以及 Enter 键),则可以使用getch.exe来下载here

根据下表返回%errorlevel%变量的值:

  • 0表示向上箭头
  • 1表示向下箭头
  • 2为右箭头
  • 3表示LEFT箭头
  • 4表示 Enter key