pyautogui.screenshot()
делает снимок экрана только основного экрана.
Если вы хотите использовать pyauto gui для захвата чего-то с других дисплеев, вы можете использовать его функцию pyautogui.screenshot(region=(0,0, 300, 400))
, но в этом случае вы потребуется получить координаты верхнего левого угла окна и размер окна - region
принимает 4-х целочисленный кортеж в качестве аргумента (left, top, width, height).
Если вы хотите получить координаты мыши, вы можете использовать например:
pyautogui.position()
, который возвратит (x, y), но все равно будет необходимо вычислить ширину и высоту окна. Так что на самом деле вам понадобятся координаты верхнего левого угла и нижнего правого угла.
Потому что:
width = int(bottom_right_x) - int(top_left_x)
height = int(bottom_right_y) - int(top_left_y)
Это поможет понять это:
0,0 X increases -->
+---------------------------+
| | Y increases
| | |
| 1920 x 1080 screen | |
| | V
| |
| |
+---------------------------+ 1919, 1079
В вашем случае я бы предложил автоматизировать процесс получения windows координат, из которых вы хотите сделать скриншот. Я написал программу, чтобы проиллюстрировать это, если вы чего-то не понимаете - оставьте комментарий. Для объединения изображений вы наверняка найдете несколько простых решений.
Попробуйте:
import pyautogui
import win32gui
import win32com.client
import mouse
import time
window_amount = int(input("type how many windows you want to capture\n"))
hwnd_list = []
# get the hwnds of windows you want to capture screenshoot from
for i in range(window_amount):
print('activate the ' + str(i+1) + ' window by clicking its icon on the taskbar')
mouse.wait(button='left', target_types=('down', 'double'))
time.sleep(0.2)
hwnd_list.append(win32gui.GetForegroundWindow())
print("list of window hwnds: " + str(hwnd_list))
# get the windows coordinates and take a screenshoot
for i in range(window_amount):
shell = win32com.client.Dispatch("WScript.Shell")
shell.SendKeys('%')
win32gui.SetForegroundWindow(hwnd_list[i])
x, y, x1, y1 = win32gui.GetClientRect(hwnd_list[i])
x, y = win32gui.ClientToScreen(hwnd_list[i], (x, y))
x1, y1 = win32gui.ClientToScreen(hwnd_list[i], (x1 - x, y1 - y))
im = pyautogui.screenshot(region=(x, y, x1, y1))
im.show()
time.sleep(0.5)
Вы также можете использовать другой модуль pyautogui
, чтобы захватить все дисплеи сразу или полностью экран выбранного дисплея. Например, mss
: https://python-mss.readthedocs.io/index.html
Без скриншота только с указанием c windows вы можете упростить процесс, но я не знаю, в этом ли ваша точка зрения .