使用C++获取Linux机器的屏幕截图

Get screenshot of linux machine using C++

本文关键字:屏幕截图 机器 Linux C++ 获取 使用      更新时间:2023-10-16

我有一个C++程序,可以截取我的Ubuntu 14.04机器的屏幕截图。该程序使用 X11 库。我需要在启动时从守护程序执行此应用程序。但它返回XOpenDisplay failed.我认为这是因为 X11 服务器未加载。是否有任何编程方式可以在加载 X11 服务器后立即获取屏幕截图?

编辑:

错过了告诉一些事情..守护程序在引导时启动,但无法截取屏幕截图。因此,启动后,我停止了守护程序并从终端重新启动它。然后显示相同的错误(XOpenDisplay 失败)。是屏幕截图和守护程序的问题吗?

这不仅仅是等到 X 服务器启动的问题。要成功连接到它:

  • X 服务器必须正在运行。
  • 程序必须知道其地址才能连接到它,该地址通常存储在环境变量DISPLAY
  • 程序必须向 X 服务器进行身份验证,这通常是通过提供从仅对当前登录的用户可读的文件读取的 X 服务器 cookie。

如果您只是将程序作为图形会话的一部分启动,而不是在引导后独立启动它,则所有这些条件都得到满足。

有几种方法可以在图形会话中实现程序启动。一种是将something.desktop文件放入/etc/xdg/autostart目录中。您可以从那里检查其他文件的语法。

/etc/X11/Xsession.d/ 中添加脚本。该脚本将在 X11 运行时运行。

如果你真的需要在引导时启动守护进程,那么你可以做的是将信号从脚本发送到守护进程。启动守护程序时,您需要将 pid 存储在某个位置。

kill -SIGUSR1 $PID

然后,您的守护程序应该在开始时注册一个信号处理程序,该处理程序将在收到信号时调用。

不过,拍摄屏幕截图可能需要动态内存分配,这是您在信号处理程序中无法执行的操作之一。因此,您需要做的是让守护程序等待条件变量,并让信号处理程序设置它并通知服务员。

X11 启动后启动守护程序比在启动时启动守护程序要简单得多。