首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一种无停顿检测按键的批量选择方案

一种无停顿检测按键的批量选择方案
EN

Stack Overflow用户
提问于 2017-04-28 21:44:56
回答 3查看 1.5K关注 0票数 0

问题是:这里有没有办法批量检测按键,而不会暂停聊天,游戏等脚本的整个脚本?现在,我了解了名为xcopy的有用命令。我使用它来检测和提取按下的键,比如Enter。但它会暂停整个脚本并等待确认,而chose可能不会暂停脚本,但无法执行静默无效键以及检测特定的无效键

EN

回答 3

Stack Overflow用户

发布于 2017-04-28 22:12:49

虽然这并不简单,但站点Dostips.com只使用批处理实现了游戏"Snake"的完整实现,包括非阻塞输入。

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

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

票数 1
EN

Stack Overflow用户

发布于 2017-04-29 02:34:19

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

这是一个使用GetKey.exe辅助文件的非常简单的示例程序:

代码语言:javascript
运行
复制
@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文件以及这些程序用户发布的回复。

票数 1
EN

Stack Overflow用户

发布于 2017-04-29 02:50:49

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

这是一个使用两个线程的示例。

第一线程:keyCheck等待一个键。

第二个线程:mainFunc计数,直到按下一个键。

代码语言:javascript
运行
复制
@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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43681748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档