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?
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?
Antworten:
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 VisibilityPartiallyObscured
oder auf VisibilityUnobscured
. Ich folge mit einem MapNotify
Ereignis, 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]))
Wenn Sie nicht haben , xwd
und xwud
auf 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. xnest
oder 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.