Làm thế nào để chụp ảnh màn hình của một cửa sổ hoàn toàn bị che khuất


7

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?


Điều này có thể xảy ra với trình quản lý cửa sổ tổng hợp, nhưng bạn có thể phải ghép lại một số phần để thực hiện.
Caleb

2
Nếu sử dụng trình quản lý cửa sổ khác là một tùy chọn, hãy xem Ảnh chụp màn hình của cửa sổ không hoạt động
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


6

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ố VisibilityPartiallyObscuredhoặc VisibilityUnobscured. Tôi theo dõi với một MapNotifysự 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]))

1
Tôi đã gọi nó như thế này: ./visibility_notify.py 0x1e00087 VisibilityUnobscured, chạy lệnh chụp màn hình sau đó đã có kết quả âm tính. Tôi không biết cách gửi "MapNotify" sau sự kiện khác.
marinara

@marinara Tôi đã thêm mã để gửi MapNotify. Nó có giúp gì không? Bạn đã thử chương trình chụp màn hình nào?
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles có thể gửi sự kiện này mà không liên quan đến bất kỳ kịch bản được thực hiện tùy chỉnh nào không? Có lẽ sử dụng một số chương trình tiện ích?
AnonymousLurker

3

Nếu bạn chưa cài đặt xwdxwudđã 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ư xnesthoặ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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.