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

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

バックグラウンドでゲームが実行されているのに見えないウィンドウのスクリーンショットを撮りたいです。 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]))

おすすめ記事