Pio*_*ioz 5 c linux x11 screenshot xlib
我有以下起始代码来获取 X 窗口的屏幕截图(该窗口可以被覆盖、不可见或最小化)。
#include <stdlib.h>
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/X.h>
#include <X11/extensions/Xcomposite.h>
#include <X11/extensions/Xrender.h>
int
main ()
{
Display *display = XOpenDisplay (NULL);
XID xid = 90177543; // xdotool search --name "World of Warcraft" | head -1
// Check if Composite extension is enabled
int event_base_return;
int error_base_return;
if (XCompositeQueryExtension (display, &event_base_return, &error_base_return))
printf ("COMPOSITE IS ENABLED!\n");
// Requests the X server to direct the hierarchy starting at window to off-screen storage
XCompositeRedirectWindow (display, xid, CompositeRedirectAutomatic);
// Preventing the backing pixmap from being freed when the window is hidden/destroyed
// If you want the window contents to still be available after the window has been destroyed,
// or after the window has been resized (but not yet redrawn), you can increment the backing
// pixmaps ref count to prevent it from being deallocated.
Pixmap pixmap = XCompositeNameWindowPixmap (display, xid);
// Get window attributes
XWindowAttributes attr;
Status s = XGetWindowAttributes (display, xid, &attr);
if (s == 0)
printf ("Fail to get window attributes!\n");
// Extract the data
XRenderPictFormat *format = XRenderFindVisualFormat (display, attr.visual);
int width = attr.width;
int height = attr.height;
int depth = attr.depth;
// What we need to do now is to create an XRender Picture for the window,
// which we'll need to draw it with the Render extension.
// A picture is a basically a handle to a server side struct with some
// additional information about a drawable (in this case a window),
// such as its format, which clipping region should be used when
// drawing it (if any), whether it should be tiled etc.
XRenderPictureAttributes pa;
pa.subwindow_mode = IncludeInferiors;
Picture picture = XRenderCreatePicture (display, xid, format, CPSubwindowMode, &pa);
// We now have all the information we need in order to be able to draw the window
// using the Xrender extension, and we've created and prepared a source picture
// for the window for this purpose.
// The Xrender function we'll use to draw the window is XRenderComposite().
//XRenderComposite (display, PictOpSrc, picture, None, ???destination???, 0,0, 0,0, 0,0, width, height);
XFreePixmap (display, pixmap);
XCompositeUnredirectWindow (display, xid, CompositeRedirectAutomatic);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
[编译代码gcc file.c -lX11 -lXcomposite -lXrender并运行./a.out]
[您可以使用命令获取桌面窗口的有效 XID xdotool search --name "Title of a window" | head -1]
现在我有两个问题:
BadMatch (invalid parameter attributes)调用该XRenderFindVisualFormat函数时出现错误。我不知道为什么。XID 为 90177543 的窗口存在。Picture picture以将其另存为 PNG 图像。我不想使用 QT 库来做到这一点。你能帮助我吗?
我能够重现您的错误,如下所示:
$ ./xidtest
COMPOSITE IS ENABLED!
X Error of failed request: BadWindow (invalid Window parameter)
Major opcode of failed request: 142 (Composite)
Minor opcode of failed request: 1 ()
Resource id in failed request: 0x5600007
Serial number of failed request: 9
Current serial number in output stream: 12
Run Code Online (Sandbox Code Playgroud)
当使用我知道存在的窗口 ID(0x440000B 或 71303179,使用 xwininfo 找到)进行设置时,我没有收到错误:
$ ./xidtest
COMPOSITE IS ENABLED!
Run Code Online (Sandbox Code Playgroud)
我的结论是,错误是您提供的窗口 ID 无效。
| 归档时间: |
|
| 查看次数: |
2207 次 |
| 最近记录: |