Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如果窗口内容发生变化,自动拍摄x服务器的屏幕截图_C_X11_Xserver - Fatal编程技术网

C 如果窗口内容发生变化,自动拍摄x服务器的屏幕截图

C 如果窗口内容发生变化,自动拍摄x服务器的屏幕截图,c,x11,xserver,C,X11,Xserver,我正在寻找一种方法,如果创建了一个窗口或窗口的内容发生了更改,可以自动拍摄我的X服务器的屏幕截图 我目前正在通过收听X11事件来实现这一点,但并不是所有的更改都被报告。查看损坏扩展中的XDamageNotifyEvent、XDamageQueryExtension、XDamageCreate和XDamageSubtract。此扩展用于跟踪更改的窗口内容。 一个很好的示例代码源是任何可以制作windows缩略图的东西。此外,任何合成窗口管理器(Compiz、metacity的某些风格等)都将包含

我正在寻找一种方法,如果创建了一个窗口或窗口的内容发生了更改,可以自动拍摄我的X服务器的屏幕截图


我目前正在通过收听X11事件来实现这一点,但并不是所有的更改都被报告。

查看损坏扩展中的XDamageNotifyEvent、XDamageQueryExtension、XDamageCreate和XDamageSubtract。此扩展用于跟踪更改的窗口内容。

一个很好的示例代码源是任何可以制作windows缩略图的东西。此外,任何合成窗口管理器(Compiz、metacity的某些风格等)都将包含损坏跟踪代码


如果没有扩展,您基本上必须轮询(在超时时更新窗口内容)。

我知道这篇文章已经过时了。然而,X11的文档非常糟糕,我花了很长时间才让XDamage在任何方面都正常工作。因此,下面是一个示例,根据Havoc的帖子中提到的文档,在每次根X11窗口更改时,都会向控制台打印一行代码,并大致以此为基础:

#包括
#包括
#包括
#包括
#包括
int endnow=0;
空洞清理(int符号){
endnow=1;
}
int main(){
显示*显示;
display=XOpenDisplay(“:0”);
如果(!显示){
perror(“无法打开显示”);
出口(1);
}
窗口根=默认根窗口(显示);
int损坏事件、损坏错误、测试;
//这一行是初始化事物所必需的
测试=XDamageQueryExtension(显示、损坏事件和损坏错误);
/*“事件”输出显然是显示在
XNextEvent返回XDamage事件时的Xevent.type字段*/
printf(“测试=%d,事件=%d,错误=%d\n”,测试,损坏事件,损坏错误);
//这是XDamage接口的处理程序
//有关更多损坏报告级别,请参阅XDamage文档
// http://www.freedesktop.org/wiki/Software/XDamage
损坏损坏=XDamageCreate(显示、根目录、xDamageReportNoneEmpty);
信号(SIGINT,清除);
//XCloseDisplay(显示);
while(endnow==0){
XEvent事件;
XNextEvent(显示和事件);
printf(“event.type=%d\n”,event.type);
//此行重置XDamage处理程序
XDamageSubtract(显示、损坏、无、无);
}
XCloseDisplay(显示);
printf(“完成”\n);
出口(0);
}
当然,如果您在与显示器相同的屏幕上从控制台运行此命令,则它打印的每一行都会自动激活,并且有点不稳定。但是,如果您从另一台计算机上的ssh终端运行它,这是一个很好的演示

#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);
}