andyduke / console-keyboard
跨平台终端键盘事件读取。
Requires
- php: >=7.4.0
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许可证的条款授权。