这是上下文:我正在运行Debian GNU / Linux,我会在桌面环境中切换(下一个是“DE”)。
我的问题很简单:我想知道当我按下键盘键“Print Screen”时使用了哪些操作,系统调用甚至功能。
DE的变化方式是什么?即Mate,Gnome,KDE,LXDE或Xfce(等)是否使用了自己代码的特定调用,还是有通用的系统调用?
我认为答案(如果有的话)不是Debian亲戚,而是X或Wayland,不是吗?
提前感谢您的建议和答案:)
PS:我确切地说我读了很多X lib源代码,但没有找到有用的东西。
答案 0 :(得分:2)
打印屏幕本身绝对不是系统调用,但获取按键的内核守护程序肯定会导致执行使用您称之为“系统调用”的例程。我把它放在引号中,因为printscreen可能导致程序运行已经在内核空间中,这意味着由于你已经存在,所以不会有任何系统调用内核(除非窗口管理器实际在用户空间运行) ,对于Mac OSX或Windows来说不是这样,而且我也假设用于Linux)。
它是如何工作的?它可能是通过将当前显示从屏幕缓冲区(DMA的区域到您的图形卡)复制,然后将像素表示转换为位图来实现的。
答案 1 :(得分:2)
基本原则可以在xwd tool中找到。
代码并不难读。在简单的场景中,它使用XGetImage
,但如果屏幕有多个可视区域,则会变得更复杂,但基本原则是使用XGetPixel
获取屏幕像素,XPutPixel
为存储在临时图像中。
当您按PrtScrn
时会发生什么情况是相同的,除了它可能是其他应用程序启动。究竟应用程序取决于分发中的图形包(Gnome,KDE,Unity等)。但在内部,他们会做一些非常相似的事情。
修改:
正如Peter指出的那样,如果窗口系统是“合成”(也就是说,每个窗口在屏幕外绘制自己的内容,而图形硬件通过合成将输出结合起来),那么屏幕捕获需要询问合成系统将输出渲染到屏幕外,然后复制它。