检测/读取按键,跨平台 PHP 命令行界面

11

我正在尝试编写一个跨平台的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不是选项。我也不想调用外部vbs或bash脚本,它必须纯粹在PHP中完成,希望我没有过多的要求。

编辑:当然,我已经检查了其他SO解决方案,但似乎没有一个真正的跨平台。在Windows上无法使用 Ncrursesreadline,必须在linux和windows上拦截 keydown 或 keypress 或 input ready 。


1
第一种解决方案需要在*nix上进行TTY调用,而第二种解决方案需要readline库,该库在Windows平台上不可用。 - DeDee
另一个问题与TTY有关(即使标记为这样),因此“ab ovo”不是跨平台问题。因此,那个问题有解决方案(甚至不止一个),而这个问题是真正的痛点,却没有解决方案。 - Sz.
2个回答

3

很遗憾,目前还没有类似于*n*x(readlinencurses)的Windows特定平台扩展程序,因此这是不可能实现的。

更糟糕的是,即使您放弃跨平台要求,我怀疑在Windows上也没有任何这样的(相对知名的)扩展程序。(人们倾向于建议编写pdcurses等绑定自己(至少它本身是跨平台的),因为显然没有人做过并发布过。)

事情正在缓慢进展,至少readline扩展现在已经适用于Windows(自7.1以来),但它恰好缺少未缓冲字符读取功能...


0
截至2023年,Windows仍没有本地解决方案。但是,可以通过PHP COM扩展拦截键。这里提供了适用于Windows x64平台和*nix与readline支持的完整解决方案:

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

如果您愿意,可以创建自己的Windows解决方案,步骤如下:

  • 创建带有截取按键方法的ATL COM DLL
  • 使用regsrv32注册dll
  • 使用PHP COM扩展并为您的DLL创建包装器

这必须在*nix和Windows上运行。你建议的方法在Linux上不起作用,甚至在32位Windows上也不起作用,可能还会出现在早期的PHP或Windows版本中。 - DeDee
@DeDee Wrapper使用readline来处理*nix系统,而对于Windows系统,则使用COM DLL。如果ATL COM DLL编译为x86平台,则也可以使用。至于PHP版本,如果在Win平台上可用COM扩展,则应该也可以工作。修改描述。 - Zenithies
谢谢您把这个问题带给我,但是"不想执行外部vbs或bash脚本"的想法可以轻松地扩展到DLL——实际上这是基本相同的想法。您的回答很有用但并没有真正回答我的问题,抱歉。 - DeDee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接