Python 使用缩放监视器捕获应用
Python app capturing with scaling monitor
我正在尝试捕获一个 window(在示例代码中我将使用 firefox),我 运行 2 以 200% 缩放比例监视 2736x1824 中的第一个和第二个 1920x1080 缩放比例为 100%。
from win32 import win32gui
def enum_cb(hwnd, results):
# CallBack function for enumeration
winlist.append((hwnd, win32gui.GetWindowText(hwnd)))
def get_screens():
win32gui.EnumWindows(enum_cb, winlist)
return [(hwnd, title) for hwnd, title in winlist if title]
def get_screensbyname(screen_name):
# Function who gets a screen by name
winlist = get_screens()
screens = [(hwnd, title) for hwnd, title in winlist if screen_name in title.lower()]
while len(screens) <= 0:
winlist = get_screens()
screens = [(hwnd, title) for hwnd, title in winlist if screen_name in title.lower()]
return screens
winlist = []
windows = get_screensbyname('firefox')
window = windows[0][0]
wRect = win32gui.GetWindowRect(window)
cRect = win32gui.GetClientRect(window)
print('GetWindowRect ', wRect)
print('GetCLientRect ', cRect)
如果 window 在第一个屏幕上,它会输出
GetWindowRect (-7, -7, 1374, 878)
GetCLientRect (0, 0, 1368, 878)
如果 window 在第二个屏幕上它输出
GetWindowRect (2728, 345, 4664, 1401)
GetCLientRect (0, 0, 1920, 1048)
现在,据我了解,它忽略了显示器上给定的缩放比例。因为如果我手动应用缩放(使用计算器),第一个输出变为
GetWindowRect (-14, -14, 2748, 1756)
GetCLientRect (0, 0, 2736, 1756)
如何应用在 window 开启的显示器上设置的缩放比例或 dpi 显示度?
我需要它来捕获内部区域并将其流式传输到文件或其他屏幕上
解决方法比较简单,添加以下几行
import ctypes
ctypes.windll.shcore.SetProcessDpiAwareness(2)
它也可以设置 SetProcessDpiAwareness(1) 不知道这两者之间的区别。
如果有人能解释一下就好了。
注意:此答案将于明天设为解决方案
我正在尝试捕获一个 window(在示例代码中我将使用 firefox),我 运行 2 以 200% 缩放比例监视 2736x1824 中的第一个和第二个 1920x1080 缩放比例为 100%。
from win32 import win32gui
def enum_cb(hwnd, results):
# CallBack function for enumeration
winlist.append((hwnd, win32gui.GetWindowText(hwnd)))
def get_screens():
win32gui.EnumWindows(enum_cb, winlist)
return [(hwnd, title) for hwnd, title in winlist if title]
def get_screensbyname(screen_name):
# Function who gets a screen by name
winlist = get_screens()
screens = [(hwnd, title) for hwnd, title in winlist if screen_name in title.lower()]
while len(screens) <= 0:
winlist = get_screens()
screens = [(hwnd, title) for hwnd, title in winlist if screen_name in title.lower()]
return screens
winlist = []
windows = get_screensbyname('firefox')
window = windows[0][0]
wRect = win32gui.GetWindowRect(window)
cRect = win32gui.GetClientRect(window)
print('GetWindowRect ', wRect)
print('GetCLientRect ', cRect)
如果 window 在第一个屏幕上,它会输出
GetWindowRect (-7, -7, 1374, 878)
GetCLientRect (0, 0, 1368, 878)
如果 window 在第二个屏幕上它输出
GetWindowRect (2728, 345, 4664, 1401)
GetCLientRect (0, 0, 1920, 1048)
现在,据我了解,它忽略了显示器上给定的缩放比例。因为如果我手动应用缩放(使用计算器),第一个输出变为
GetWindowRect (-14, -14, 2748, 1756)
GetCLientRect (0, 0, 2736, 1756)
如何应用在 window 开启的显示器上设置的缩放比例或 dpi 显示度?
我需要它来捕获内部区域并将其流式传输到文件或其他屏幕上
解决方法比较简单,添加以下几行
import ctypes
ctypes.windll.shcore.SetProcessDpiAwareness(2)
它也可以设置 SetProcessDpiAwareness(1) 不知道这两者之间的区别。 如果有人能解释一下就好了。
注意:此答案将于明天设为解决方案