我正在寻找一种方法,可以在创建窗口或窗口内容发生变化时自动截取我的X服务器的屏幕截图。
我目前通过收听X11事件来实现这一目标,但并未报告所有更改。
答案 0 :(得分:5)
查看Damage扩展中的XDamageNotifyEvent,XDamageQueryExtension,XDamageCreate,XDamageSubtract。此扩展名用于跟踪更改窗口内容。 http://www.freedesktop.org/wiki/Software/XDamage
示例代码的一个很好的来源是制作Windows缩略图的任何东西。此外,任何合成窗口管理器(Compiz,某些类型的metacity等)都将包含损坏跟踪代码。
如果没有扩展名,您基本上必须轮询(在超时时更新窗口内容)。
答案 1 :(得分:2)
我知道这篇文章已经死了。然而,X11的文档非常糟糕,我花了很长时间才能让XDamage在任何方面都有效。因此,这是一个示例,根据Havoc的帖子中提到的文档,每次根X11窗口更改时都会向控制台打印一行,并且松散地基于此link:
#include <stdio.h>
#include <stdlib.h>
#include <X11/extensions/Xdamage.h>
#include <X11/Xlib.h>
#include <signal.h>
int endnow = 0;
void cleanup(int SIGNUM){
endnow = 1;
}
int main(){
Display *display;
display = XOpenDisplay(":0");
if(!display){
perror("could not open display");
exit(1);
}
Window root = DefaultRootWindow(display);
int damage_event, damage_error, test;
//this line is necessary to initialize things
test = XDamageQueryExtension(display, &damage_event, &damage_error);
/*The "event" output is apparently the integer that appears in the
Xevent.type field when XNextEvent returns an XDamage event */
printf("test = %d, event = %d, error = %d\n",test,damage_event, damage_error);
//This is the handler for the XDamage interface
//See the XDamage documentation for more damage report levels
// http://www.freedesktop.org/wiki/Software/XDamage
Damage damage = XDamageCreate(display, root, XDamageReportNonEmpty);
signal(SIGINT,cleanup);
// XCloseDisplay(display);
while(endnow == 0){
XEvent event;
XNextEvent(display,&event);
printf("event.type = %d\n",event.type);
//this line resets the XDamage handler
XDamageSubtract(display,damage,None,None);
}
XCloseDisplay(display);
printf("done\n");
exit(0);
}
当然,如果你从与显示器:0
相同的屏幕上的控制台运行它,它打印的每一行都会自动激活,并且有点不稳定。但如果你从另一台计算机上的ssh终端运行它,这是一个很好的演示。