Batch file 批量选择用于无暂停检测密钥的备选方案

Batch file 批量选择用于无暂停检测密钥的备选方案,batch-file,Batch File,问题是:这里有没有任何方法可以在不暂停整个脚本(如聊天、游戏等)的情况下批量检测按键?现在我知道了一个名为xcopy的有用命令。我使用它来检测和提取按下的键,如回车键。但它会暂停整个脚本并等待确认,而Choice可能不会暂停脚本,但无法执行静音无效密钥以及检测特定密钥虽然这一过程并不简单,但该网站只使用批处理(包括非阻塞输入)来完整实现游戏 本质上,batchfile生成第二个命令提示符,该提示符在输入时阻塞。当接收到输入时,它被路由到第一个“主”程序,该程序轮询输入文件 就像我说的,不是直接的

问题是:这里有没有任何方法可以在不暂停整个脚本(如聊天、游戏等)的情况下批量检测按键?现在我知道了一个名为xcopy的有用命令。我使用它来检测和提取按下的键,如回车键。但它会暂停整个脚本并等待确认,而Choice可能不会暂停脚本,但无法执行静音无效密钥以及检测特定密钥

虽然这一过程并不简单,但该网站只使用批处理(包括非阻塞输入)来完整实现游戏

本质上,batchfile生成第二个命令提示符,该提示符在输入时阻塞。当接收到输入时,它被路由到第一个“主”程序,该程序轮询输入文件


就像我说的,不是直接的或简单的,但它是可以做到的。

虽然它一点也不简单,但该网站只使用批处理(包括非阻塞输入)就可以完全实现游戏

本质上,batchfile生成第二个命令提示符,该提示符在输入时阻塞。当接收到输入时,它被路由到第一个“主”程序,该程序轮询输入文件


正如我所说,这不是直接的或简单的,但它是可以做到的。

尽管可能,但没有一种简单的方法可以使用纯批处理命令来做到这一点。最简单的方法是使用专门为此设计的第三方.exe程序,如我的GetKey.exe辅助文件。该程序从键盘获取一个键,并通过ERRORLEVEL返回一个值,该值指示按下的键。处理所有键:ASCII字符作为正值返回,扩展键(功能键、光标控制键等)作为负值返回。如果给定/N开关,则GetKey.exe不等待:如果未按下某个键,则返回的值为零

这是一个使用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
@echo关闭
setlocal EnableDelayedExpansion
rem GetKey.exe辅助程序的简单示例,用于检测按下的键
rem获取返回(ASCII 13)CR字符
对于('copy/Z'%~F0“NUL')中的/F%%a,请设置“CR=%%a”
cls
随时按一个键;按ESC键结束
回音/
集合i=0
:循环
设置/A i+=1
设置/P“=%i%!CR!”
您可以从下载GetKey.exe辅助程序;您还可以下载SHOWKEYCODES.BAT程序,该程序显示GetKey.exe为键盘中的所有键返回的代码,包括Shift、Ctrl和Alt组合


PS-如果您不愿意使用第三方.exe程序,只需考虑原始的
choice
命令也是一个大小为35 KB的.exe文件,但我的GetKey.exe文件大小仅为1536字节。您可以查看我的几个辅助.exe文件以及这些程序的用户在同一链接上发布的回复。

尽管可能,但使用纯批处理命令并不是一种简单的方法。最简单的方法是使用专门为此设计的第三方.exe程序,如我的GetKey.exe辅助文件。该程序从键盘获取一个键,并通过ERRORLEVEL返回一个值,该值指示按下的键。处理所有键:ASCII字符作为正值返回,扩展键(功能键、光标控制键等)作为负值返回。如果给定/N开关,则GetKey.exe不等待:如果未按下某个键,则返回的值为零

这是一个使用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
@echo关闭
setlocal EnableDelayedExpansion
rem GetKey.exe辅助程序的简单示例,用于检测按下的键
rem获取返回(ASCII 13)CR字符
对于('copy/Z'%~F0“NUL')中的/F%%a,请设置“CR=%%a”
cls
随时按一个键;按ESC键结束
回音/
集合i=0
:循环
设置/A i+=1
设置/P“=%i%!CR!”
您可以从下载GetKey.exe辅助程序;您还可以下载SHOWKEYCODES.BAT程序,该程序显示GetKey.exe为键盘中的所有键返回的代码,包括Shift、Ctrl和Alt组合


PS-如果您不愿意使用第三方.exe程序,只需考虑原始的
choice
命令也是一个大小为35 KB的.exe文件,但我的GetKey.exe文件大小仅为1536字节。您可以查看我的几个辅助.exe文件,以及这些程序的用户在同一链接上发布的回复。

使用纯批处理并不简单,但这是可能的

这是一个使用两个线程的示例。
第一个线程
: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
@echo关闭
setlocal DisableDelayedExpansion
设置“func=%~0”
对于(“%func:\=%”中的/F“delims=\”%%X,请设置“func=%%X”
如果“:”=%func:~0,1%(
转到%func%
)
(“%$d0\:keyCheck\…%~pnx0”)>lock.tmp”;“%$d0\:mainFunc\…%~pnx0”
埃科恩德
退出/b
REM***螺纹1-等待钥匙
:keyCheck
对于/f skip^=1^delims^=^eol^=%%A in('replace.exe?/u/w'),对于/f delims^=^eol^=%%B in(“%%A”)do(
设置键=%%B
)
退出/b
REM***螺纹2-计数
:mainFunc
setlocal EnableDelayedExpansion
对于/F%%#in('copy/Z“%~dpf0”NUL'),请设置“CR=%%#”
设置“lastTime=”
设置cnt=0
:循环
设置/a cnt+=1
set/p“=用任意键停止!cnt!!CR!”lock.tmp&&(
回音(
出口
)
)2>nul
设置“现在=%time:~-2%”
如果“!现在!”NEQ“!上次!”(
设置“lastTime=!now!”
退出/b
)
后藤:服务员

使用纯批处理并不简单,但它是可能的

这是一个使用两个线程的示例。
第一个线程
: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
@echo关闭
setlocal Dis