使用批处理检测不同窗口中的击键

时间:2016-12-14 00:15:55

标签: batch-file

堆栈溢出的公平人士!我今天的问题是如何检测按键,而不是批处理窗口本身。我已经有了这个代码:

choice /c KEY /n /t 5 /d d
if %errorlevel%==1 goto restofcode

如果您选择批处理窗口本身,则此有效。我需要的是一种方式,批量(或其他语言),以便检测您是否按下实际批处理命令行本身的Ctrl + W

有一个名为GS Auto-Clicker的程序,当你按一个键时它会开始点击你的鼠标。我想要这样的东西来检测你按下的键。

1 个答案:

答案 0 :(得分:3)

Okie doke,这是一个使用Batch + PowerShell混合脚本演示GetAsyncKeyState()的示例。使用.bat扩展名保存。希望内联评论充分解释它是如何工作的。 See the MSDN page on GetAsyncKeyState()获取有关该函数的预期参数和返回值类型的完整详细信息。

编辑:修正了错误。如果用户按下并释放 W 然后按 Ctrl ,将触发原始答案。我的PowerShell 2.0解释器似乎有一些错误的行为。在每次循环迭代中将变量设置为GetAsyncKeyState()返回值似乎可以解决它。通过利用System.Windows.Forms.Keys collection,我还使关键定义变得不那么紧张,并且消除了最近按下"的可能性。 bit会触发“#34;当前按下"”的误报。

<# : batch portion (begins PowerShell multiline comment block)
@echo off & setlocal

set /P "=Waiting for ctrl-W... "<NUL

rem # re-launch self with PowerShell interpreter
powershell -noprofile "iex (${%~f0} | out-string)"

echo Pressed.  Toodles.

goto :EOF
: end batch / begin PowerShell chimera #>

# import GetAsyncKeyState()
Add-Type user32_dll @'
    [DllImport("user32.dll")]
    public static extern short GetAsyncKeyState(int vKey);
'@ -namespace System

# for Keys object constants
Add-Type -As System.Windows.Forms

function keyPressed($key) {
    return [user32_dll]::GetAsyncKeyState([Windows.Forms.Keys]::$key) -band 32768
}

while ($true) {
    $ctrl = keyPressed "ControlKey"
    $W = keyPressed "W"
    if ($ctrl -and $W) { break }
    start-sleep -milliseconds 40
}

$Host.UI.RawUI.FlushInputBuffer()