Вот GTK2 пример, у меня заработал. Заставить работать код с использованием GTK3 не получается.
#include <gtk/gtk.h>
#include <gdk/gdk.h>
static gboolean save_screenshot(GdkWindow * gdk_window,
const gchar * screenshot_path)
{
GdkPixbuf * pixbuf;
gint x;
gint y;
gint width;
gint height;
gint depth;
gboolean success;
g_assert(NULL != gdk_window);
g_assert(NULL != screenshot_path);
gdk_window_get_geometry(gdk_window, &x, &y, &width, &height, &depth);
pixbuf = gdk_pixbuf_get_from_drawable(NULL , gdk_window, gdk_colormap_get_system(), 0, 0, 0, 0, width, height);
if (NULL == pixbuf) {
g_warning("gdk_pixbuf_get_from_drawable failed.");
return FALSE;
}
success = gdk_pixbuf_save(pixbuf, screenshot_path, "png", NULL, NULL);
g_object_unref(pixbuf);
return success;
}
gboolean button_clicked(GtkWidget* widget) {
GdkWindow *root_window;
root_window = gdk_get_default_root_window ();
save_screenshot(root_window, "./1.png");
return TRUE;
}
int main(int argc, char **argv) {
GtkWidget *window = NULL;
GtkWidget *button = NULL;
GtkWidget *fixed = NULL;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
fixed = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window), fixed);
button = gtk_button_new_with_label("Save");
g_signal_connect(button, "clicked", G_CALLBACK(button_clicked), NULL);
gtk_fixed_put(GTK_FIXED(fixed), button, 55, 10);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
Вот пример на Qt, сам я не пробывал собирать данный пример.
http://doc.qt.io/qt-5/qtwidgets-desktop-screenshot-example.html