Снимок экрана конкретного окна с помощью c/GTK

Это кусок кода, который создает окно:

#include <gtk/gtk.h>

static GtkWidget* createWindow()
{
    GtkWidget *window;
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
    gtk_widget_set_name(window, "GtkLauncher");
    g_signal_connect_swapped(G_OBJECT(window), "destroy",
    G_CALLBACK(gtk_main_quit), NULL);
    return window;
}

int main(int argc, char* argv[])
{
    GtkWidget *main_window;
    gtk_init(&argc, &argv);
    if (!g_thread_supported())
        g_thread_init(NULL);
    main_window = createWindow();
    gtk_widget_grab_focus(main_window);
    gtk_widget_show_all(main_window); 
    gtk_main();
    return 0;
}

И здесь: Конвертировать скрипт Python GTK в C, я получил, как сделать снимок экрана.

gdk_get_default_root_window() даст мне скриншот рабочего стола.

gdk_screen_get_active_window (gdk_screen_get_default()) даст мне скриншот любого активного окна.

Есть ли способ сделать скриншот создаваемого окна в приведенном выше коде??

1 ответ

Я думаю, что это должно сработать, хотя вам, возможно, потребуется повторить основной цикл после отображения окна, чтобы заставить его рисовать правильно, и в этом случае вам понадобится еще немного кода (я не проверял это)

#include <unistd.h>
#include <stdio.h>
#include <gtk/gtk.h>
#include <cairo.h>


static GtkWidget* createWindow()
{
    GtkWidget *window;
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
    gtk_widget_set_name(window, "GtkLauncher");
    g_signal_connect_swapped(G_OBJECT(window), "destroy",
    G_CALLBACK(gtk_main_quit), NULL);
    return window;
}


int main(int argc, char **argv)
{
    gdk_init(&argc, &argv);

    GtkWidget *main_window = createWindow();
    gtk_widget_show_all(main_window);

    // may not need this, it also may not be enough either
    while (gtk_events_pending ()) gtk_main_iteration (); 

    GdkWindow *w = GDK_WINDOW(main_window);


    gint width, height;
    gdk_drawable_get_size(GDK_DRAWABLE(w), &width, &height);

    GdkPixbuf *pb = gdk_pixbuf_get_from_drawable(NULL, 
                       GDK_DRAWABLE(w), 
                       NULL, 
                       0,0,0,0,width,height);

    if(pb != NULL) {
        gdk_pixbuf_save(pb, "screenshot.png", "png", NULL);
        g_print("Screenshot saved to screenshot.png.\n");
    } else {
        g_print("Unable to get the screenshot.\n");
    }
    return 0;
}

Если это не сработает, вам придется переместить снимок экрана с помощью обработчика событий, который подключается к какому-либо событию (я не уверен, что, вероятно, window-state-event тогда нужно посмотреть на событие, чтобы выяснить, когда делать скриншот)

Другие вопросы по тегам