2

我在 Ted Mielczarek 的网站上找到了这段代码来截取屏幕截图。

/*
 * gdk-screenshot.cpp: Save a screenshot of the root window in .png format.
 *  If a filename is specified as the first argument on the commandline,
 *  then the image will be saved to that filename. Otherwise, the image will
 *  be saved as "screenshot.png" in the current working directory.
 *
 * Compile with:
 * g++ -o gdk-screenshot gdk-screenshot.cpp `pkg-config --cflags --libs gdk-x11-2.0`
 */

#include <gdk/gdk.h>
#include <gdk/gdkx.h>

int main(int argc, char** argv)
{
  gdk_init(&argc, &argv);
  GdkWindow* window = window = gdk_get_default_root_window ();
  GdkPixbuf* screenshot = gdk_pixbuf_get_from_drawable (NULL, window, NULL,
                            0, 0, 0, 0,
                            gdk_screen_width(),
                            gdk_screen_height());
  GError* error = NULL;
  const char* filename = (argc > 1) ? argv[1] : "screenshot.png";
  return TRUE == gdk_pixbuf_save (screenshot, filename, "png",
                  &error, NULL);
}

我按照描述对其进行了编译,它似乎可以正常工作,因为它会生成具有正确尺寸的图像,但屏幕截图完全是黑色的。 黑色截图

这似乎是运行 Wayland 的系统上的一个常见 问题(我正在使用 Wayland 运行 Archlinux),所以我的问题是:

需要对此代码进行哪些修改才能在 Wayland(和 X)上生成正确的屏幕截图?

4

1 回答 1

0

我有一个类似的问题。

我使用 Xlib 截屏,但是这种方法在 Wayland 上不起作用。每次跑到xgetimage,都报错。查资料后发现Wayland不允许这样的截图。但是,通过这种方式,我仍然可以获得正确的屏幕尺寸。

现在我使用DBUS调用系统的会话总线进行截图,这是我通过阅读Gnome截图源代码了解到的。

这是一个简单的总结代码:

    method_name = "Screenshot";
    method_params = g_variant_new ("(bbs)",
                                     TRUE,
                                     FALSE, /* flash */
                                     filename);

    connection = g_application_get_dbus_connection (g_application_get_default ());
    g_dbus_connection_call_sync (connection,
                               "org.gnome.Shell.Screenshot",
                               "/org/gnome/Shell/Screenshot",
                               "org.gnome.Shell.Screenshot",
                               method_name,
                               method_params,
                               NULL,
                               G_DBUS_CALL_FLAGS_NONE,
                               -1,
                               NULL,
                               &error);

文档链接在这里: https ://developer.gnome.org/references

Gnome 截图的 GitHub 在这里: https ://github.com/GNOME/gnome-screenshot

于 2021-07-16T06:13:18.760 回答