检测/读取按键,跨平台 PHP CLI

问题描述 投票:0回答:2

我正在尝试编写一个供个人使用的跨平台 PHP 实用程序,而不是重新发明任何东西。 代码将在或多或少的范围内运行

while (true) {
    $key = null;
    $key = check_key_pressed();
    if ($key) do_relevant_magic($key);
    usleep(250000);
}

我需要

check_key_pressed()
的东西,它将返回按下的键的值,而不是等待
EOF/EOL
,在实际按下任何键之前不明确要求输入。

必须*nix和windows上工作所以

ncurses
不是一个选项。我也不希望
exec
调用外部 vbs 或 bash 脚本,它必须完全用 PHP 完成,希望我不要期望太多。

编辑:当然,我检查了其他 SO 解决方案,但似乎没有一个是真正跨平台的。

Ncrurses
readline
在 Windows 上不可用,这必须拦截 keydownkeypressinput ready 在 linux 和 windows 上。

php input keyboard cross-platform command-line-interface
2个回答
3
投票

不幸的是,如果没有针对 Windows 的类似平台特定扩展(如 *n*x(

readline
ncurses
)),这是不可能的(直到今天)。

更糟糕的是,即使您放弃了跨平台要求,我怀疑在 Windows 上是否有任何这样的(相当知名的)扩展。 (人们倾向于推荐自己为pdcurses(至少本身是跨平台的)编写绑定,因为显然还没有人完成并发布一个。)

事情进展缓慢,至少

readline
扩展现在可用于Windows(自7.1起),但它恰好只是缺少无缓冲的字符读取功能...


0
投票

截至 2023 年,Windows 仍然没有原生解决方案。但是,可以通过 PHP COM 扩展拦截密钥。此处提供了适用于 Windows x64 平台和支持 readline 的 *nix 的完整解决方案:

https://github.com/zenithies/php-toolkit-read-key

如果你喜欢,你可以自己制作,食谱:

  • 使用拦截按键的方法创建 ATL COM DLL
  • 使用 regsrv32 注册 dll
  • 使用 PHP COM 扩展并为您创建包装器 DLL
© www.soinside.com 2019 - 2024. All rights reserved.