バックグラウンドでゲームが実行されているのに見えないウィンドウのスクリーンショットを撮りたいです。 X11のすべてのスクリーンショットユーティリティでは、ウィンドウを表示する必要があるようです。これを行う方法はありますか?
答え1
これはスクリーンショットユーティリティではなくゲーム関連の問題かもしれません。 X11トランスポートアプリケーション可視性通知イベントは、ウィンドウが完全に見える、部分的に隠れている、または完全に隠されていることを知らせます。ウィンドウが完全に隠れると、ほとんどのアプリケーションはディスプレイを更新しないため、リソースが節約されます。つまり、誰も見なければ木は倒れないでしょう。
VisibilityNotifyイベントをゲームウィンドウに送信するように見えるようにすると、スクリーンショットを取得できるようです。 X11自体はその時点で一般的なイベントを送信するため、ウィンドウが隠された後にイベントを送信する必要があります。ここVisibilityNotifyイベントを送信するためのテストされていないスクリプト。VisibilityPartiallyObscured
パラメータまたはを使用して呼び出しますVisibilityUnobscured
。活動をフォローしましたが、役に立つMapNotify
かどうかわかりません。 Pythonと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]))
答え2
まだインストールされておらず、システムにすでにインストールされている場合は、xwd
パッケージxwud
マネージャを介して最大数秒で簡単にインストールできない場合は非常に驚きます。
%人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.
これがXサーバーに組み込まれたデスクトップセッション記録ソフトウェアであることを理解してください。これにより、スクリーンショットなどを撮ることができます。しかし、始める前に文書を読んで、よく知っているのが良いと思います。
注 - 上記のように、ターゲットウィンドウをマウスカーソルで選択する必要はありません。これは引数なしで呼び出すときの基本的な動作です。完全なインターフェイスは完全にスクリプト可能です。
もう少しスクロールすると...
-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.
私のアドバイスを受け入れれば、あなたもよく見ることになるでしょう。xdoツールしかし、ここでの関連性は明らかに限定的である。 @Gillesが参照しているように、XバックエンドAPIへの直接のコマンドラインインターフェイスを提供しますが、主にマウススクリプトを作成します。そして使い方はとても簡単です。
しかし、最大の問題は、モニターが現在使用されていることです。ウィンドウが目に見えないままである必要がある場合は、これを処理する方法がいくつかあります。しかし、窓を置く前に試してみる必要があるようです。私が提案するアプローチは、単に画面サイズを画面サイズの2倍にすることです。これにより、ウィンドウを画面からドラッグするだけでディスプレイは更新され続けますが、画面には更新されません。私はnvidiaのツールを使ってこれを行うことができ、ほとんどの人がこれを行うことができますが、xrandr,
特にLinuxでは、少なくとも私の経験によると、ディスプレイの問題は設定する方法が多すぎるため、個人的な問題であることがよくあります。
これを達成する別の方法は、仮想Xサーバーを使用することです。例えば、xnest
これらのサーバーは、xephyr.
X サーバー全体をウィンドウ内にネストし、バックグラウンドで実行したり、必要に応じてまったく存在しないことがあります。残念ながら、しばらく前に私が最後に確認したときにこれらが使用されていました。x仮想ドライバ- したがって、ビデオアクセラレーションが必要なビデオゲームには良い選択ではありません。あなたのマニュアルページからより多くの情報を得ることができると確信しています。しかし、私が助けてくれることを願っています。