完全に隠されたウィンドウのスクリーンショットを撮る方法

完全に隠されたウィンドウのスクリーンショットを撮る方法

バックグラウンドでゲームが実行されているのに見えないウィンドウのスクリーンショットを撮りたいです。 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仮想ドライバ- したがって、ビデオアクセラレーションが必要なビデオゲームには良い選択ではありません。あなたのマニュアルページからより多くの情報を得ることができると確信しています。しかし、私が助けてくれることを願っています。

関連情報