将 ASCII 码转换为 AT 设置 2 键盘扫描码

将 ASCII 码转换为 AT 设置 2 键盘扫描码

我想用子命令发送几个字符virtualbox controlvm keyboardputscancode。 virtualbox 期望的扫描码是IBM PC AT 设置 2 键盘扫描码,在我的例子中并不(总是)对应于例如显示的扫描码showkey -s

理想情况下,我想要一些可以包装到 bash 脚本中的东西,这样我就可以将任意字符串发送到虚拟机,例如:

virtualbox controlvm <vm> keyboardputscancode $(asc2sc "My String here")

asc2sc我的 bash 脚本在哪里!

是否有“IBM AT Set 2”键盘的扫描码映射,我可以使用它,而无需自己生成它?遗憾的是,Oracle 对于具体细节非常模糊。

答案1

如果您只需要在虚拟机中支持单个键盘布局,那么最简单的方法是在脚本中对转换进行硬编码。

typeset -A scancodes
scancodes['1']='02 82'  # press 1, release 1
scancodes['!']='2a 02 82 aa'  # press left Shift, press 1, release 1, release left shift
# emit_scancodes VM STRING
emit_scancodes () {
  typeset a=; typeset c string="$2"
  while [ -n "$string" ]; do
    c=${scancodes[${string:0:1}]
    if [ -z "$c" ]; then
      echo >&2 "Unsupported character: ${string:0:1}"
      return 1
    fi
    a+=("$c")
    string=${string:1}
  done
  for c in "${a[@]}"; do
    virtualbox controlvm "$1" keyboardputscancode
    # For long strings, you may need an additional short sleep here
  done
}

如果您需要支持各种键盘布局,那么您可以利用 Linux 的控制台键盘映射Linux 控制台工具数据。这些文件包含类似以下的行

keycode 16 = q
keycode   2 = one              exclam

然而,解析文件以构建转换表将是一项不小的工作量,而且我不知道它已经完成。

相关内容