使用C++获取Linux机器的屏幕截图
Get screenshot of linux machine using C++
我有一个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 启动后启动守护程序比在启动时启动守护程序要简单得多。
相关文章:
- Winapi:屏幕截图未显示在窗口中
- 截取屏幕截图后程序卡住
- C++鼠标单击时的屏幕截图不起作用
- GTKMM:拍摄绘图区域的屏幕截图?
- 有没有办法使用 ofstream 保存屏幕截图?
- 如何使用 DX11 截取屏幕截图?
- avcodec_receive_packet错误(gdi 屏幕截图 + ffmpeg)
- C++屏幕截图 - 如何读取位图?
- 使用QT C 屏幕截图
- 如何将屏幕截图位图转换为 cv::Mat
- QT自动保存使用命名模板的屏幕截图
- C 屏幕截图
- BMP的完整屏幕截图.与块状和保存有关的问题
- 使用OpenCV和C++在按键上截取网络摄像头源的屏幕截图
- DirectX 部分屏幕截图
- 截取屏幕截图,分析它,然后删除它
- WXWIDGETS应用于WXStaticBitMap时,屏幕截图将大部分图像留为空白
- 屏幕截图桌面DirectX C /QT
- 使用C++获取Linux机器的屏幕截图
- 如果知道IP地址,我可以拍摄远程机器的屏幕截图吗