Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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 XGetImage中的Xlib映像抓取失败_C_Xlib - Fatal编程技术网

C XGetImage中的Xlib映像抓取失败

C XGetImage中的Xlib映像抓取失败,c,xlib,C,Xlib,Cookie裁剪(从假定的工作代码)一个简单的C程序,使用XGetImage()执行Xlib图像抓取。在这一点上,我并没有试图处理图像,这只是一个概念证明,看看图像抓取是否有效-它没有。XGetImage()调用失败,如下所示: X Error of failed request: BadMatch (invalid parameter attributes) Major opcode of failed request: 73 (X_GetImage) Serial number

Cookie裁剪(从假定的工作代码)一个简单的C程序,使用XGetImage()执行Xlib图像抓取。在这一点上,我并没有试图处理图像,这只是一个概念证明,看看图像抓取是否有效-它没有。XGetImage()调用失败,如下所示:

X Error of failed request:  BadMatch (invalid parameter attributes)
  Major opcode of failed request:  73 (X_GetImage)
  Serial number of failed request:  21
  Current serial number in output stream:  21
我花了相当多的时间研究这个问题,显然这个问题困扰了其他开发人员,但没有最终的答案。有人知道我该怎么解决这个问题吗?我可以从printf中看出感兴趣的窗口被正确识别。XMapRaised()是先前线程对此问题的建议,但似乎没有帮助。代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "/usr/include/X11/Xlib.h"

Window findScidWindow(Display *display )
{
    Bool found = False;
    Window rootWindow = RootWindow(display, DefaultScreen(display));
    Atom atom = XInternAtom(display, "_NET_CLIENT_LIST", True);
    Atom actualType;
    int format;
    unsigned long numItems;
    unsigned long bytesAfter;

    unsigned char *data = '\0';
    Window *list;
    char *windowName;

    int status = XGetWindowProperty(display, rootWindow, atom, 0L, (~0L), False,
        AnyPropertyType, &actualType, &format, &numItems, &bytesAfter, &data);
    list = (Window *)data;

    if (status >= Success && numItems)
    {
        for (int i = 0; i < numItems; ++i)
        {
            status = XFetchName(display, list[i], &windowName);
            if (status >= Success)
            {
                if(strstr(windowName, "Scid vs. PC") != NULL)
                {
                    XFree(windowName);
                    XFree(data);
                    return list[i];
                }
            }
        }
    }
}
void
main( int argc, char*argv )
{
    Display* d = XOpenDisplay(":0.0");
    XImage *image;

    Window root = (Window)0x0560003b; /* obtained via 'wmctrl -l -G' */

    Window ScidWindow = findScidWindow(d);
    XWindowAttributes attrib;

    XGetWindowAttributes(d, ScidWindow, &attrib);

    int width = attrib.width;
    int height = attrib.height;
printf("width: %d    height: %d\n",width,height);

    XMapRaised(d, root);

    /* coordinates 438,110 obtained via 'wmctrl -l -G' */
    image = XGetImage( d, ScidWindow, 438, 110, width, height, AllPlanes, ZPixmap);
}
#包括
#包括
#包括
#include“/usr/include/X11/Xlib.h”
窗口查找CidWindow(显示*显示)
{
Bool-found=False;
窗口根窗口=根窗口(显示,默认屏幕(显示));
Atom=XInternAtom(显示“\u网络\u客户端\u列表”,真);
原子实际类型;
int格式;
无符号长numItems;
未签名的长bytesAfter;
无符号字符*数据='\0';
窗口*列表;
字符*窗口名;
int status=XGetWindowProperty(显示、根窗口、原子、0L、(~0L)、假、,
AnyPropertyType、&actualType、&format、&numItems、&bytesAfter、&data);
列表=(窗口*)数据;
如果(状态>=Success&&numItems)
{
对于(int i=0;i=成功)
{
if(strstr(windowName,“Scid vs.PC”)!=NULL)
{
XFree(windowName);
XFree(数据);
返回列表[i];
}
}
}
}
}
无效的
main(int argc,char*argv)
{
显示*d=XOpenDisplay(:0.0”);
XImage*图像;
窗口根=(窗口)0x0560003b;/*通过“wmctrl-l-G”获取*/
窗口ScidWindow=findscidfown(d);
xb;
XGetWindowAttributes(d、ScidWindow和attrib);
int width=attrib.width;
整数高度=属性高度;
printf(“宽度:%d高度:%d\n”,宽度,高度);
XMapRaised(d,根);
/*通过“wmctrl-l-G”获得的坐标438110*/
image=XGetImage(d,ScidWindow,438110,宽度,高度,所有平面,ZPixmap);
}
问题是

image=XGetImage(d,ScidWindow,438110,宽度,高度,所有平面,ZPixmap);
使用
x=438
y=110
,如果
x+width
实际上大于窗口宽度(高度相同),则这是一个特别的问题

因此,这里我必须假设您没有尝试裁剪窗口图像,而是希望拍摄一个普通的原始屏幕截图,那么您只需要对x和y传递0:

image=XGetImage(d,ScidWindow,0,0,宽度,高度,所有平面,ZPixmap);
解释是,协调系统不是完整的显示或屏幕,而是您正在抓取的窗口之一。表示窗口从(0,0)开始


这也花了我一段时间才弄明白。

我也有类似的问题。我的观察结果是,无论何时使用根窗口id,它都会工作,但当使用不是根窗口(窗口管理器的)的特定窗口id时,它会失败,并出现相同的错误。您可以通过
xwininfo-root-tree-int
检查窗口树,看看从树中传递不同的ID是否会对您有所改变。