Taking a screenshot of a particular window with c/

2019-03-02 09:57发布

问题:

This question already has an answer here:

  • save current window as image using gtk# 1 answer

This is a piece of code which creates a window:

#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;
}

And in here: Convert a GTK python script to C , i got how to take a screenshot.

gdk_get_default_root_window() will give me the screenshot of the desktop.

gdk_screen_get_active_window (gdk_screen_get_default()) will give me the screenshot of any active window.

Is there any way to take the screenshot of the window being created in the code above??

回答1:

I think this should do it, although you may need to iterate the main loop after showing the window to get it to paint properly, in which case you'll need some more code (I haven't tested this)

#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;
}

If it doesn't work you'll have to move the screenshot taking into an event handler that connects to some event (I'm not sure which probably window-state-event then you have to look at the event to figure out when to take the screenshot)