【问题标题】:Trace/syscalls the "Print Screen" process跟踪/系统调用“打印屏幕”过程
【发布时间】:2013-08-05 19:13:57
【问题描述】:

这是上下文:我正在运行 Debian GNU/Linux,并且我经常切换到桌面环境(下一个是“DE”)。
我的问题很简单:我想知道当我按下键盘键“Print Screen”时使用了哪些操作、系统调用甚至函数。

DE 会改变这种方式吗? IE。 Mate、Gnome、KDE、LXDE 或 Xfce(等)是否使用了它们自己代码的特定调用,或者是否存在通用系统调用?

我认为答案(如果有的话)不是 Debian 相关的,而是更多的 X 或 Wayland,不是吗?

提前感谢您的建议和回答:)

PS:我准确地说我阅读了很多 X lib 源代码,但没有找到有用的东西。

【问题讨论】:

  • 您是指从按键到将图像存储到剪贴板的整个过程,还是只是将屏幕内容复制到临时位图中的整个过程? (我不确定我是否知道答案,但它肯定有助于理解您要求的部分)
  • 我对将屏幕内容复制到临时位图中的那个感兴趣,无论 WM/DE 是什么。

标签: c++ c linux system-calls printscreen


【解决方案1】:

打印屏幕本身绝对不是系统调用,但获取按键的内核守护程序肯定会导致执行一个使用您称之为“系统调用”的例程。我把它放在引号中,因为 printscreen 可能会导致已经在内核空间中运行的程序,这意味着不会对内核进行任何系统调用,因为你已经在那里(除非窗口管理器实际上在用户空间运行,这不适用于 Mac OSX 或 windows,我假设对于 linux 也是如此)。

它是如何工作的?它可能通过将当前显示从屏幕缓冲区(内存区域,这是 DMA'd 到您的显卡)复制,然后将像素表示转换为位图来工作。

【讨论】:

  • 确实,我知道从屏幕缓冲区复制当前显示的过程,无论 WM/DE 是什么。
  • 您必须将调试器附加到内核中的keyboard_event 处理程序。我尝试查看 X11 的打印屏幕代码,但找不到。
  • 嗯,所有形式的 Unix(Linux、MacOS 等)中的窗口管理器绝对是用户模式进程 - 图形驱动器可以在内核模式下运行,但 WM 是用户模式过程。
【解决方案2】:

基本原理见xwd tool

代码读起来还不错。在简单的场景中使用XGetImage,但是如果屏幕有多个可视区域,会变得更复杂,但基本原理是使用XGetPixel获取屏幕像素,使用XPutPixel存储在临时图像中。

按下PrtScrn 时发生的情况是一样的,只是它可能是启动了其他一些应用程序。确切的应用程序取决于发行版中的图形包(Gnome、KDE、Unity 等)。但在内部,他们会做一些非常相似的事情。

编辑:

正如彼得所指出的,如果窗口系统是“合成”的(即每个窗口在屏幕外绘制自己的内容,图形硬件通过合成组合输出),那么屏幕捕获需要询问合成系统在屏幕外渲染输出,然后复制它。

【讨论】:

猜你喜欢
  • 2012-04-03
  • 2011-04-21
  • 2013-10-15
  • 2013-10-05
  • 2016-11-13
  • 2012-06-20
  • 2017-01-04
  • 2011-08-02
  • 1970-01-01
相关资源
最近更新 更多