백그라운드에서 게임이 실행되고 있는데 보이지 않는 창의 스크린샷을 찍고 싶습니다. 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에 대한 직접적인 명령줄 인터페이스를 제공하지만 주로 마우스 스크립트를 작성합니다. 그리고 사용이 매우 간단합니다.
그렇긴 하지만, 가장 큰 문제는 모니터가 현재 사용되고 있다는 것입니다. 창문이 보이지 않는 상태로 유지되어야 하는 경우, 이를 처리할 수 있는 몇 가지 방법이 있습니다. 하지만 창문을 내려놓기 전에 시도해 보아야 할 것 같습니다. 제가 제안하는 접근 방식은 단순히 화면 크기를 화면 크기의 두 배로 구성하는 것입니다. 이렇게 하면 창을 화면 밖으로 끌기만 하면 디스플레이가 계속 업데이트되지만 화면에는 업데이트되지 않습니다. 나는 nvidia의 도구를 사용하여 이 작업을 수행할 수 있었고 대부분의 사람들이 이를 수행할 수 있지만, xrandr,
특히 Linux에서는 적어도 내 경험에 따르면 디스플레이 문제는 구성할 수 있는 방법이 너무 많기 때문에 개인적인 문제인 경우가 많습니다.
이를 달성하는 또 다른 방법은 가상 X 서버를 사용하는 것입니다. 예를 들어 xnest
이러한 서버는 xephyr.
전체 X 서버를 창 내에 중첩하여 백그라운드에서 실행되거나 원하는 경우 전혀 존재하지 않을 수 있습니다. 아쉽게도 얼마 전 제가 마지막으로 확인했을 때 이것들이 사용되고 있었습니다.x가상 드라이버- 따라서 비디오 가속이 필요한 비디오 게임에는 좋은 선택이 아닙니다. 귀하의 매뉴얼 페이지에서 더 많은 정보를 얻을 수 있다고 확신합니다. 하지만 제가 도움을 드릴 수 있기를 바랍니다.