Tôi có một trò chơi đang chạy trong nền, nhưng tôi muốn chụp ảnh màn hình của cửa sổ không nhìn thấy được. Có vẻ như tất cả các tiện ích chụp màn hình cho X11 cần cửa sổ hiển thị. Có cách nào để làm việc này không?
Tôi có một trò chơi đang chạy trong nền, nhưng tôi muốn chụp ảnh màn hình của cửa sổ không nhìn thấy được. Có vẻ như tất cả các tiện ích chụp màn hình cho X11 cần cửa sổ hiển thị. Có cách nào để làm việc này không?
Câu trả lời:
Có lẽ đó là lỗi của trò chơi, không phải lỗi của tiện ích chụp màn hình. X11 gửi cho các ứng dụng một sự kiện VisibilityNotify để nói với chúng rằng cửa sổ của chúng hiển thị đầy đủ, bị che khuất một phần hoặc bị che khuất hoàn toàn. Khi cửa sổ bị che khuất hoàn toàn, hầu hết các ứng dụng không bận tâm cập nhật màn hình của chúng, giúp tiết kiệm tài nguyên. Nói cách khác, nếu không có ai ở đó để nhìn thấy nó, cây sẽ không rơi.
Tôi nghĩ rằng nếu bạn gửi cho cửa sổ trò chơi một sự kiện VisibilityNotify để giả vờ rằng nó hiển thị, thì bạn sẽ nhận được ảnh chụp màn hình của mình. Bạn sẽ cần gửi sự kiện sau khi cửa sổ bị che khuất, vì chính X11 sẽ gửi sự kiện bình thường vào thời điểm đó. Đây là tập lệnh chưa được kiểm tra gửi sự kiện VisibilityNotify, gọi nó bằng đối số VisibilityPartiallyObscured
hoặc VisibilityUnobscured
. Tôi theo dõi với một MapNotify
sự kiện, tôi không biết nó có hữu ích không. Bạn cần Python và 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]))
Nếu bạn chưa cài đặt xwd
và xwud
đã cài đặt trên hệ thống của mình, tôi sẽ rất ngạc nhiên nếu bạn không thể dễ dàng cài đặt chúng thông qua trình quản lý gói trong vài giây.
% 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.
Hiểu đây là một loại phần mềm ghi phiên máy tính để bàn - được tích hợp trong máy chủ X - nó cho phép bạn chụp ảnh màn hình, và nhiều hơn nữa. Nhưng tôi sẽ muốn đọc tài liệu một chút trước khi lặn vào - chỉ để làm quen với nó, tôi nghĩ vậy.
Lưu ý - cửa sổ mục tiêu không cần phải được chọn thông qua con trỏ chuột như đã đề cập ở trên - đó chỉ là hành vi mặc định khi nó được gọi mà không có đối số. Toàn bộ giao diện là hoàn toàn có thể script.
Chỉ cần cuộn thêm một chút và ...
-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.
Tuy nhiên, nếu bạn nghe theo lời khuyên của tôi, bạn cũng sẽ xem xét khá kỹ về xdotool , tuy nhiên, phải thừa nhận rằng nó có liên quan hạn chế ở đây. Nó kịch bản chủ yếu là chuột, mặc dù nó cung cấp một số giao diện dòng lệnh trực tiếp cho api phụ trợ X - như các tham chiếu @Gilles. Và nó khá đơn giản để sử dụng.
Tất cả những gì đã nói, vấn đề chính là màn hình của bạn hiện đang bị chiếm đóng. Nếu cửa sổ của bạn phải ở ẩn, có thể xử lý nó theo một số cách - mặc dù bạn sẽ phải thử chúng một chút, tôi nghĩ, trước khi bạn hạ chúng xuống. Cách tôi muốn giới thiệu chỉ là cấu hình màn hình của bạn có kích thước gấp đôi màn hình của bạn. Bằng cách đó, bạn có thể chỉ cần kéo cửa sổ ra khỏi màn hình và nó sẽ tiếp tục cập nhật màn hình - nhưng tắt màn hình. Tôi có thể làm điều này với các công cụ của nvidia và hầu hết có thể làm điều này với xrandr,
, nhưng, đặc biệt là trong Linux, ít nhất theo kinh nghiệm của tôi, vấn đề hiển thị thường là vấn đề cá nhân chỉ vì có rất nhiều cách có thể để định cấu hình chúng.
Một cách khác có thể được thực hiện là với một máy chủ X ảo - chẳng hạn như xnest
hoặc xephyr.
Các máy chủ này lồng toàn bộ máy chủ X trong một cửa sổ có thể được làm nền hoặc hoàn toàn không tồn tại nếu bạn thích. Thật không may, tôi đã kiểm tra lần trước, thật không may, những thứ này đang sử dụng trình điều khiển xdummy - và do đó sẽ không phải là lựa chọn tốt cho một trò chơi video yêu cầu tăng tốc video. Tuy nhiên, tôi chắc chắn các trang người đàn ông của bạn có thể cho bạn biết nhiều hơn và tôi chỉ có thể hy vọng tôi đã giúp.