这是创build一个窗口的一段代码:
#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; }
在这里: 将一个GTK Python脚本转换为C ,我得到了如何截图。
gdk_get_default_root_window()
会给我桌面的截图。
gdk_screen_get_active_window (gdk_screen_get_default())
会给我任何活动窗口的屏幕截图。
有没有什么办法可以在上面的代码中创build窗口的截图?
我认为这应该做到这一点,虽然你可能需要迭代主窗口后显示窗口才能正确绘制,在这种情况下,你需要更多的代码(我还没有测试过)
#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
那么你必须看事件,找出什么时候截图)