So machen Sie einen Screenshot eines völlig verdeckten Fensters

7

Ich habe ein Spiel im Hintergrund, aber ich möchte Screenshots des Fensters machen, das nicht sichtbar ist. Anscheinend müssen alle Screenshot-Dienstprogramme für X11 das Fenster sichtbar haben. Gibt es eine Möglichkeit, dies zu tun?

Marinara
quelle
Dies sollte mit einem Compositing-Fenstermanager möglich sein, aber Sie müssen möglicherweise einige Teile zusammenschustern, um dies zu erreichen.
Caleb
2
Wenn die Verwendung eines anderen Fenstermanagers eine Option ist, siehe Screenshot eines nicht aktiven Fensters
Gilles 'SO - hör auf böse zu sein'

Antworten:

6

Es ist wahrscheinlich die Schuld des Spiels, nicht die Schuld des Screenshot-Dienstprogramms. X11 sendet Anwendungen ein VisibilityNotify- Ereignis, um ihnen mitzuteilen, dass ihr Fenster vollständig sichtbar, teilweise verdeckt oder vollständig verdeckt ist. Wenn das Fenster vollständig verdeckt ist, müssen die meisten Anwendungen ihre Anzeige nicht aktualisieren, wodurch Ressourcen gespart werden. Mit anderen Worten, wenn niemand da ist, um es zu sehen, fällt der Baum nicht.

Ich denke, wenn Sie dem Spielfenster ein VisibilityNotify-Ereignis senden, um vorzutäuschen, dass es sichtbar ist, erhalten Sie Ihren Screenshot. Sie müssen das Ereignis senden, nachdem das Fenster verdeckt wurde, da X11 selbst zu diesem Zeitpunkt sein normales Ereignis sendet. Hier ist ein nicht getestetes Skript, das ein VisibilityNotify-Ereignis sendet. Rufen Sie es mit dem Argument VisibilityPartiallyObscuredoder auf VisibilityUnobscured. Ich folge mit einem MapNotifyEreignis, ich weiß nicht, ob es nützlich ist. Sie benötigen Python und Python-xlib.

#! /usr/bin/env python
import re, sys, time
import Xlib.X, Xlib.XK, Xlib.display, Xlib.protocol

def parse_action(string):
    state = {
              '0': 0,
              '1': 1,
              '2': 2,
              'unobscured': 0,
              'partiallyobscured': 1,
              'fullyobscured': 2,
              'visibilityunobscured': 0,
              'visibilitypartiallyobscured': 1,
              'visibilityfullyobscured': 2,
             }[string.lower()]
    return state

def parse_window(display, arg):
    wid = int(arg, 0)
    return display.create_resource_object('window', wid)

def send_event(display, window, state):
    window.send_event(Xlib.protocol.event.VisibilityNotify(window=window,
                                                           state=state))
    window.send_event(Xlib.protocol.event.MapNotify(window=window,
                                                    event=window,
                                                    override=False))
    display.sync()

if __name__ == "__main__":
    display = Xlib.display.Display()
    send_event(display, parse_window(display, sys.argv[1]), parse_action(sys.argv[2]))
Gilles 'SO - hör auf böse zu sein'
quelle
1
Ich habe es so genannt: ./visibility_notify.py 0x1e00087 VisibilityUnobscured, das anschließende Ausführen des Screenshot-Befehls hatte ein negatives Ergebnis. Ich weiß nicht, wie ich nach dem anderen Ereignis eine "MapNotify" senden soll.
Marinara
@marinara Ich habe Code zum Senden von MapNotify hinzugefügt. Hilft es? Welche Screenshot-Programme haben Sie ausprobiert?
Gilles 'SO - hör auf böse zu sein'
@ Gilles ist es möglich, dieses Ereignis ohne benutzerdefinierte Skripte zu senden? Vielleicht mit einem Hilfsprogramm?
AnonymousLurker
3

Wenn Sie nicht haben , xwdund xwudauf Ihrem System bereits installiert wäre ich sehr überrascht sein , wenn man nicht so leicht sie höchstens über Paket - Manager in wenigen Sekunden installieren konnte.

% man xwd

NAME
       xwd - dump an image of an X window

SYNOPSIS
       xwd  [-debug] [-help] [-nobdrs] [-out file] [-xy] [-frame] [-add value]
       [-root | -id id | -name name ] [-icmap] [-screen]  [-silent]  [-display
       display]

DESCRIPTION
       Xwd  is  an X Window System window dumping utility.  Xwd allows X users
       to store window images in a specially formatted dump file.   This  file
       can  then be read by various other X utilities for redisplay, printing,
       editing, formatting, archiving, image processing, etc.  The target win‐
       dow  is  selected  by  clicking the pointer in the desired window.  The
       keyboard bell is rung once at the beginning of the dump and twice  when
       the dump is completed.

Verstehen Sie, dass dies eine Art Desktop-Sitzungsaufzeichnungssoftware ist, die in den X-Server integriert ist und Screenshots und vieles mehr ermöglicht. Aber Sie sollten die Dokumentation ein wenig lesen, bevor Sie eintauchen - nur um sich damit vertraut zu machen, denke ich.

Hinweis - Das Zielfenster muss nicht wie oben erwähnt mit dem Mauszeiger ausgewählt werden. Dies ist nur das Standardverhalten, wenn es ohne Argumente aufgerufen wird. Die gesamte Oberfläche ist vollständig skriptfähig.

Scrollen Sie einfach ein bisschen mehr und ...

   -root   This option indicates that the root window should  be  selected
           for  the  window  dump,  without requiring the user to select a
           window with the pointer.

   -id id  This option  indicates  that  the  window  with  the  specified
           resource  id  should  be  selected for the window dump, without
           requiring the user to select a window with the pointer.

Wenn Sie meinen Rat befolgen , werden Sie sich xdotool auch ziemlich genau ansehen , allerdings hat es hier nur eine begrenzte Relevanz. Es schreibt meistens Skripte mit der Maus, bietet jedoch eine direkte Befehlszeilenschnittstelle zur X-Backend-API - als @ Gilles-Referenzen. Und es ist ziemlich einfach zu bedienen.

Das Hauptproblem ist jedoch, dass Ihr Display derzeit belegt ist. Wenn Ihr Fenster unsichtbar bleiben muss, können Sie es auf verschiedene Arten handhaben - obwohl Sie es ein wenig ausprobieren müssen, denke ich, bevor Sie es herunterfahren. Ich würde nur empfehlen, Ihren Bildschirm so zu konfigurieren, dass er doppelt so groß ist wie Ihr Bildschirm. Auf diese Weise können Sie das Fenster einfach vom Bildschirm ziehen und die Anzeige wird weiterhin aktualisiert - jedoch außerhalb des Bildschirms. Ich kann dies mit den Tools von nvidia tun, und die meisten können dies mit tun, xrandr,aber insbesondere unter Linux scheinen Anzeigeprobleme zumindest meiner Erfahrung nach oft persönliche Probleme zu sein, nur weil es so viele Möglichkeiten gibt, sie zu konfigurieren.

Eine andere Möglichkeit besteht darin, einen virtuellen X-Server zu verwenden, z. B. xnestoder xephyr.Diese Server verschachteln einen gesamten X-Server in einem Fenster, das im Hintergrund oder vollständig nicht vorhanden sein kann, wenn Sie dies bevorzugen. Zuletzt habe ich überprüft, was leider vor einiger Zeit war, dass diese den xdummy-Treiber verwendeten - und daher keine gute Wahl für ein Videospiel wären, das eine Videobeschleunigung erfordert. Trotzdem bin ich sicher, dass Ihre Manpages Ihnen mehr erzählen könnten, und ich kann nur hoffen, dass ich geholfen habe.

mikeserv
quelle