问题是:这里有没有办法批量检测按键,而不会暂停聊天,游戏等脚本的整个脚本?现在,我了解了名为xcopy的有用命令。我使用它来检测和提取按下的键,比如Enter。但它会暂停整个脚本并等待确认,而chose可能不会暂停脚本,但无法执行静默无效键以及检测特定的无效键
发布于 2017-04-28 22:12:49
虽然这并不简单,但站点Dostips.com只使用批处理实现了游戏"Snake"的完整实现,包括非阻塞输入。
本质上,批处理文件产生第二个命令提示符,该提示符在输入时阻塞。当接收到输入时,它被路由到第一个“主”程序,该程序轮询输入文件。
正如我所说的,这不是直接或简单的,但它是可行的。
发布于 2017-04-29 02:34:19
尽管有可能,但使用纯批处理命令并不是一种简单的方法。最简单的方法是使用专门设计的第三方.exe程序,比如我的GetKey.exe辅助文件。这个程序从键盘获取一个键,并通过ERRORLEVEL返回一个表示按下的键的值。处理所有键: ASCII字符作为正值返回,扩展键(功能键、光标控制键等)作为负值返回。如果给定了/N开关,则GetKey.exe no waits:如果没有按下某个键,则返回的值为零。
这是一个使用GetKey.exe辅助文件的非常简单的示例程序:
@echo off
setlocal EnableDelayedExpansion
rem Simple example of GetKey.exe auxiliary program to detect keys pressed
rem Get a Return (ASCII 13) CR character
for /F %%a in ('copy /Z "%~F0" NUL') do set "CR=%%a"
cls
echo Press a key at any moment; press ESC key to end
echo/
set i=0
:loop
set /A i+=1
set /P "=%i%!CR!" < NUL
GetKey /N
if %errorlevel% equ 0 goto loop
echo/
echo Key pressed: %errorlevel%
if %errorlevel% neq 27 goto loop
您可以从this site下载GetKey.exe辅助程序,也可以下载显示GetKey.exe对键盘上所有按键返回的代码的SHOWKEYCODES.BAT程序,包括Shift-、Ctrl-和Alt-组合键。
PS -如果您不愿意使用第三方.exe程序,只需考虑原始的choice
命令也是一个35KB大小的.exe文件,但我的GetKey.exe文件只有1536字节大小。您可以在同一链接上查看我的几个辅助.exe文件以及这些程序用户发布的回复。
发布于 2017-04-29 02:50:49
使用纯批处理并不简单,但也是可能的。
这是一个使用两个线程的示例。
第一线程:keyCheck
等待一个键。
第二个线程:mainFunc
计数,直到按下一个键。
@echo off
setlocal DisableDelayedExpansion
set "func=%~0"
for /F "delims=\" %%X in ("%func:*\=%") do set "func=%%X"
if ":" == "%func:~0,1%" (
goto %func%
)
( "%~d0\:keyCheck\..%~pnx0" ) > lock.tmp | "%~d0\:mainFunc\..%~pnx0"
echo Ende
exit /b
REM *** Thread1 - waiting for key
:keyCheck
for /f skip^=1^ delims^=^ eol^= %%A in ('replace.exe ? . /u /w') do for /f delims^=^ eol^= %%B in ("%%A") do (
set key=%%B
)
exit /b
REM *** Thread2 - Counting up
:mainFunc
setlocal EnableDelayedExpansion
for /F %%# in ('copy /Z "%~dpf0" NUL') do set "CR=%%#"
set "lastTime="
set cnt=0
:loop
set /a cnt+=1
set /p "=Stop with any key !cnt! !CR!" < nul
call :waitOrStop
goto :loop
:waitOrStop
REM Check if a key was pressed, then the lock is released
(
(
rem
) 2> lock.tmp && (
echo(
exit
)
) 2> nul
set "now=%time:~-2%"
if "!now!" NEQ "!lastTime!" (
set "lastTime=!now!"
exit /b
)
goto :waitOrStop
https://stackoverflow.com/questions/43681748
复制相似问题