andyduke/console-keyboard

跨平台终端键盘事件读取。

v1.1.0 2023-09-20 11:25 UTC

This package is not auto-updated.

Last update: 2024-10-02 19:21:40 UTC


README

跨平台终端键盘事件读取。

在Linux、Windows、MacOS中使终端(包括箭头键、escape、enter等)按键处理成为可能。

注意:仅适用于PHP 7.4及以上版本,且在Windows上使用FFI。

用法

首先,您需要使用静态的create()方法创建Keyboard类,这将根据当前平台创建所需的类版本

$k = Keyboard::create();

然后,您需要使用foreach循环来读取输入的按键

foreach($k->read() as $key) {

}

您无需设置控制台模式以隐藏按键输出的输出 - 当循环开始时,Keyboard类会自动执行此操作,并在退出循环时恢复控制台模式。

注意:按下Ctrl-C会中断读取循环。

在循环内处理每个按键,例如显示每个按下的按键名称

$k = Keyboard::create();
foreach($k->read() as $key) {
  echo $key . PHP_EOL;
}

在循环内,您可以实现任何逻辑,检查哪个键被按下,例如,在上面的示例中,您可以使用q键退出循环

$k = Keyboard::create();
foreach($k->read() as $key) {
  if ($key == 'q') {
    break;
  }

  echo $key . PHP_EOL;
}

对于如箭头键、escape、enter、空格键、insert、delete等键,Keyboard类定义了一组可以在比较中使用的常量

$k = Keyboard::create();
foreach($k->read() as $key) {
  if ($key == 'q' || $key == Keyboard::ESC) {
    break;
  }

  echo $key . PHP_EOL;
}

如果您不仅想得到按下的键的名称,还想得到代码(对于Linux/MacOS这是ANSI代码,对于Windows这是扫描代码),您应使用readKey()方法来读取键,而不是read()

readKey()方法返回一个包含键名和代码的Key对象,分别可以使用getKey()getRawKey()方法访问。

Key对象可以与字符串进行比较,这会将它转换为字符串并返回键的名称。显示按键名称和代码的示例;按下q键退出读取循环

$k = Keyboard::create();
foreach($k->readKey() as $key) {
  if ($key == 'q') {
    break;
  }

  echo $key->getKey() . ' (' . $key->getRawKey() . ')' . PHP_EOL;
}

键常量

为什么使用生成器?

read()readKey()方法返回一个生成器,因此您必须使用foreach循环或其他迭代器处理方法来读取键盘输入。

这种方式实现是因为它允许Keyboard类在读取控制台输入的开始自动设置控制台模式,并在读取循环结束时恢复控制台模式。

许可证

本项目根据BSD 3-Clause许可证的条款授权。