【问题标题】:Detect Keystrokes In Different Window with Batch批量检测不同窗口中的击键
【发布时间】:2019-05-06 13:48:14
【问题描述】:

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

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

在您选择批处理窗口本身时有效。我需要的是一种批量(或其他语言)的方法,以使其检测您是否在实际批处理命令行本身的 外部 按下 Ctrl+W。

有一个名为 GS Auto-Clicker 的程序,它会在您按下某个键时开始点击您的鼠标。就检测您按下的键而言,我想要这样的东西。

【问题讨论】:

  • 可以使用来自 user32.dll 的GetAsyncKeyState()。无论聚焦哪个窗口,这都会检测到按键。
  • 您可以将键盘热键添加到快捷方式。然后你可以把一个script.vbs作为createobject("WScript.Shell").AppActivate "Window Title"的目标。如果您在启动 bat 的快捷方式上放置热键,则该键将切换到 bat(如果它已经在运行)。
  • Rojo,你能给我一个如何使用 GetAsyncKeyState() 的例子吗?我想检测按键,然后运行命令。谢谢!
  • waitfpr cmd。

标签: batch-file


【解决方案1】:

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

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

<# : 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()

【讨论】:

  • 在这里我稍晚了一点,我正在使用它并且它工作正常,但现在我收到一个错误“powershell”不被识别为内部或外部命令。我试图修改它,让它循环起来,它确实可以工作,但现在不行了。
  • @BatchMan 听起来你搞砸了%PATH% 环境变量。重启后问题是否仍然存在?如果您转到 cmd 控制台并键入 where powershell,该命令是否会返回到 powershell.exe 的完全限定路径?如果这些都没有帮助,也许您应该发布一个单独的问题来显示您尝试的修改。
  • 嗯,我在弄乱路径,当我有机会时,我会尝试把它恢复到原来的样子。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多