Golang检测是否聚焦或最小化

时间:2019-05-10 14:50:11

标签: go

我将如何检测go CLI程序是否处于焦点或最小化状态?

基于https://github.com/jroimartin/gocui

的当前程序

我需要此功能,因为它是一个聊天程序,并且我想发送OS通知,但仅当该程序没有重点关注或最小化时才发送。

到目前为止,您不确定要从哪里开始。我们非常感谢您的帮助/指导。

2 个答案:

答案 0 :(得分:3)

从库本身是不可能的。命令行程序现在确实具有焦点,但是它正在其中运行的终端程序。

要实现该目标(如果可能的话)将取决于os,窗口管理器等。

答案 1 :(得分:2)

要完善answer提供的@mbuechmann,我建议OP不要尝试使用API​​等。

推理很简单。 “当代”用户习惯于在终端仿真器中运行程序,这些程序通常以单独的 windows 呈现,因此用户自然会认为这些程序与GUI应用程序并没有什么不同。

但是实际情况有所不同:终端仿真器(无论是否为图形终端(例如,所谓的"virtual consoles" provided by the Linux kernel running on an x86/amd64 hardware都是终端仿真器))都在真实的hardware terminal上模拟了典型的工作会话,在那里,一个程序将仅在前台运行,并且“切换”到另一个程序的唯一方法是使用shell's job control(那些jobsbgfg命令)。

换句话说,在终端中运行的程序的整个概念都有一个固有的假设,即该终端始终是“前景” —自从概念开发之初,终端就是一个物理设备。

现在也请考虑一下,“终端仿真”在现代系统上可能比您想象的更普遍:类Unix操作系统上的screentmux正在复用终端仿真器,它们本身可能可以在终端仿真器中运行,并且Windows™上的控制台窗口也可以被视为各种终端仿真器。

因此,“重新分类为API”存在几个技术问题:

  • 终端仿真试图将使用此工具的程序与实际知道如何提供该工具的程序分离开来。

    简单起见,例如,X Window System上没有简单的方法来知道运行程序的终端仿真器使用的是哪个窗口。

  • 您需要涵盖各种API,以使程序仍然有用:类Unix系统上的X Window系统,Mac OS,Windows™。而且,在Linux上运行的现代GUI堆栈倾向于切换到Wayland而不是X。

  • 在某些情况下,例如在“嵌套”终端仿真会话中运行程序(例如,在tmux中运行的xterm的“窗口”中的窗格),这样的关于环境的事实可能几乎是不可能的。

还有一个关键的问题是,如果您的程序确实确实需要了解是否是针对性的,它实际上想要了解当前几乎无法访问的概念。它。我的意思是,它想成为GUI。如果是这样,只需使其成为GUI。

实际上,它可能比您想象的要简单。程序的核心可能仍然是一个带有薄型GUI包装的CLI应用程序,它使用任何类型的IPC与该应用程序通信(如果需要,可以是双向的)。 最简单的方法是将一些(通常是逐行的)数据写入程序的标准输入。