0

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

DE会改变方式吗?即 Mate、Gnome、KDE、LXDE 或 Xfce(等)是否使用了他们自己的代码的特定调用,或者是否有通用系统调用?

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

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

PS:我准确地说我阅读了 X lib 源代码的大部分内容,但没有找到有用的东西。

4

2 回答 2

2

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

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

于 2013-08-05T19:19:55.747 回答
2

基本原理可以在xwd 工具中找到。

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

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

编辑:

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

于 2013-08-05T19:44:15.003 回答