好吧,让我们把这个疑问分成几个部分。 第一个问题,如何在 Windows 上的特定应用程序窗口中制作 pyautogui.locateOnScreen() ?例如,仅在 Windows 计算器中搜索图像?
第二个问题是我有2个显示器,如何在特定显示器上搜索图像?
我编写了一个简单的代码,但无法工作,因为我的计算器在我的第二台显示器上打开。
def main():
try:
while True:
button7location = pyautogui.locateOnScreen('images/calc7Key.png', region=(0,0,1920, 1080), confidence=.5)
print(button7location)
except KeyboardInterrupt:
print('\nDone.')
main()
这个答案可能迟到了,但对于那些寻找答案的人来说,答案就在这里: https://github.com/asweigart/pyautogui/issues/321
引用 - 为我解决
如果仍然与 Windows 上的人相关:
我认为问题在于,当前版本的 pyscreeze 在 Windows 上使用 >ImageGrab (Pillow) 仅使用单屏抓取。
pyscreeze中的一个肮脏的快速修复可能是:
- 启用全屏抓取:
文件中:
,功能:pyscreeze/__init__.py
def _screenshot_win32(imageFilename=None, region=None):
将
更改为im = ImageGrab.grab()
im = ImageGrab.grab(all_screens= True)
- 处理由于多显示器而引入的新负坐标:
文件中:
,功能:pyscreeze/__init__.py
后面def locateOnScreen(image, minSearchTime=0, **kwargs):
>addretVal = locate(image, screenshotIm, **kwargs)
if retVal and sys.platform == 'win32': # get the lowest x and y coordinate of the monitor setup monitors = win32api.EnumDisplayMonitors() x_min = min([mon[2][0] for mon in monitors]) y_min = min([mon[2][1] for mon in monitors]) # add negative offset due to multi monitor retVal = Box(left=retVal[0] + x_min, top=retVal[1] + y_min, width=retVal[2],height=retVal[3])
- 别忘了添加
import win32api
文件中:
:pyscreeze/__init__.py
if sys.platform == 'win32': # TODO - Pillow now supports ImageGrab on macOS. import win32api # used for multi-monitor fix from PIL import ImageGrab
这个答案有点晚了,但无论如何:D
捕获Windows上的特定窗口
没有直接的方法可以在任何操作系统上执行此操作,因为只有 pyautogui 搜索监视器捕获的图像。这意味着没有字面意思 对计算机进程或窗口的引用。要执行此操作,请在 不太好,但工作方法是找到所需的角落 使用某种标识符的窗口。然后你可以计算 基于这些点的窗口区域。
例如,这里是在 Windows 上获取 cmd 窗口的代码:
cmd_identifier = None
cmd_identifier = pyautogui.locateOnScreen(
os.path.join(WINDOWS_IMG_DIR, CMD_IDENTIFIER_IMG),
confidence=0.8,
minSearchTime=10,
)
cmd_bar_region = None
screen_size = pag.size()
cmd_bar_region = (
cmd_identifier.left,
cmd_identifier.top,
screen_size.width,
cmd_identifier.top + cmd_identifier.height,
)
cmd_options = None
# Focus cmd
pyautogui.click(
cmd_bar_region[0] + cmd_bar_region[2] / 2,
cmd_bar_region[1] + cmd_bar_region[3] / 2,
)
cmd_options = pyautogui.locateOnScreen(
os.path.join(WINDOWS_IMG_DIR, "window_options.png"),
confidence=0.8,
region=cmd_bar_region,
minSearchTime=10,
)
cmd_options_to_screen_bottom_region = (
cmd_options.left,
cmd_options.top,
cmd_options.left + cmd_options.width,
screen_size.height,
)
scrollbar_arrow_down = None
scrollbar_arrow_down = pyautogui.locateOnScreen(
os.path.join(WINDOWS_IMG_DIR, "scrollbar_arrow_down.png"),
confidence=0.8,
region=cmd_options_to_screen_bottom_region,
minSearchTime=10,
)
cmd_content_region = (
cmd_identifier.left,
cmd_identifier.top + cmd_identifier.height,
scrollbar_arrow_down.left,
scrollbar_arrow_down.top + scrollbar_arrow_down.height,
)
特定显示器搜索
这个问题已经回答了这里