跟踪/系统调用"Print Screen"进程
Trace/syscalls the "Print Screen" process
这是上下文:我正在运行Debian GNU/Linux,并且我与桌面环境定期切换(下一个为"DE")
我的问题很简单:我想知道当我按下键盘键"打印屏幕"时使用了哪些操作、系统调用甚至函数。
DE会改变方式吗?例如,Mate、Gnome、KDE、LXDE或Xfce(等)是否使用了自己代码的特定调用,或者是否存在通用系统调用?
我认为答案(如果有的话)不是Debian的亲戚,而是更多的X或Wayland,不是吗?
提前感谢您的建议和回答:)
PS:我准确地说,我读了Xlib源代码的一大部分,但没有发现有用的东西。
打印屏幕本身肯定不是系统调用,但获得按键的内核守护进程肯定会导致执行一个使用您称之为"系统调用"的例程,这意味着不会有任何对内核的系统调用,因为你已经在那里了(除非窗口管理器实际上在用户空间运行,这对Mac OSX或windows来说不是真的,我假设对linux也是如此)。
它是如何工作的?它的工作原理可能是从屏幕缓冲区(ram的DMA区域)复制当前显示,然后将像素表示转换为位图。
基本原理可以在xwd工具中找到。
代码读起来没那么糟糕。在简单的场景中,它使用了XGetImage
,但如果屏幕有多个视觉区域,它会变得更复杂,但基本原理是使用XGetPixel
来获得屏幕像素,使用XPutPixel
来存储在临时图像中。
按下PrtScrn
时发生的情况是一样的,只是可能是其他应用程序启动了。具体的应用程序取决于发行版中的图形包(Gnome、KDE、Unity等)。但在内部,他们会做一些非常相似的事情。
编辑:
正如Peter所指出的,如果窗口系统是"合成"的(也就是说,每个窗口都在屏幕外绘制自己的内容,图形硬件通过合成来组合输出),那么屏幕捕获就需要要求合成系统在屏幕外渲染输出,然后复制它。
- boost::进程间消息队列引发错误
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 是否可以通过C++扩展强制多个python进程共享同一内存
- IPC使用多个管道和分支进程来运行Python程序
- 异常属于C++中的线程还是进程
- WMI检测进程创建事件-c++
- c++多进程编写一个唯一的文件
- 如何在C++中将函数发送到另一个进程
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 终止 QProcess 不会终止子进程
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- Windows 进程间同步类似事件?
- 在挂钩启动新线程时解除挂钩进程
- pclose() 不会给我进程退出代码
- 运行代码时,c++ 会终止进程
- 可以读入进程内存的最大块大小是多少?
- 枚举进程模块在有效句柄上返回无效句柄
- 如何读取特定地址的进程内存?
- 跟踪/系统调用"Print Screen"进程