我经常从 PHP CLI 脚本启动“后台脚本”。也就是说,启动一个最小化(分组)的 cmd.exe 窗口。
但是,有时我想通过编程“将其置于最前面”,例如当它运行了很长时间并最终完成时。我对一直看到它不感兴趣——只有在它完成时才看到它。所以我需要能够从 PHP CLI 脚本运行某种 shell_exec() 命令,以便根据需要将其窗口置于最前面。
这可能吗?我主要针对 Windows 提问,但由于我试图使我所做的一切都尽可能独立于平台,所以我很想听到一个适用于“三大平台”(Windows、Mac、Linux)的答案。
答案1
窗口管理是非常平台相关。
与此相关,大多数平台中的控制台窗口实际上并不属于您的 PHP 脚本 - 就窗口管理 API 而言,它是一个单独的程序。
(还请注意,在 Windows 上,不是cmd.exe 窗口 – 它是一个“Windows 控制台”窗口,由旧系统上的 CSRSS 或现代系统上的 Conhost 绘制。由于 Conhost 是系统级组件,因此您可能根本无法控制它。)
有用于可移植创建和绘制的 API 库自己的窗口(例如游戏的 SDL),但大多数都不包括管理属于其他程序的窗口。所以无论如何,你最终都会使用特定于平台的技巧。(事实上,在具有新 Wayland 图形系统的 Linux 上,根本没有办法管理属于其他程序的窗口,所以如果你需要这个,你最好切换回 X11。)
对于 Windows,类似近红外命令可以工作:它似乎有一个
win focus
子命令。对于带有 X11 的 Linux,可能
wmctrl
或xdotool
。
(我实际上更喜欢 PHP 的FFI
模块直接调用系统 API,因为这样脚本就不依赖于任何外部工具,但它肯定比编写准备好的程序要多得多shell_exec
,不幸的是 FFI 只能在下一个PHP 发布。)
尽管如此,未经请求就将窗口置于最前面通常是贫穷的用户体验。大多数窗口系统都有不同的功能 - 它们允许窗口将自己标记为“紧急”或“需要注意”。
再次,我不确定这在 Windows 控制台上是否可行,但在 Linux 和 macOS 上,它可能就像向终端输出 ASCII“铃声”字符一样简单:要么只是,要么echo "\b";
可能更可靠fwrite(STDERR, "\b"); fflush(STDERR);
。ASCII BEL 的最初目的是引起操作员的注意,因此大多数终端仿真器本身将其转换为“需要注意”标志。