屏幕截图无法捕获屏幕上的内容

时间:2018-08-07 22:59:31

标签: python python-imaging-library screenshot win32gui pyautogui

我试图自动拍摄屏幕截图,但根据导航方式,我并不总是捕获屏幕上的实际内容。

作为ML中的一项练习,我试图编写一个机器人来玩赛车游戏,并且在玩它的同时应该每秒截取屏幕截图并记录遥测。我正在使用pynput来导航GUI,使用pyvjoy来控制汽车。游戏具有一个菜单屏幕,您可以在其中选择汽车和赛道,然后单击以开始活动。此时,菜单屏幕将更改为加载屏幕,在加载屏幕上方,将打开另一个进程和窗口,其中将进行比赛。点击Alt + Tab会显示两个单独的窗口,任务管理器会显示2个进程。

当我导航到事件窗口而没有离开事件窗口时,让机器人开始,失败并重新开始比赛时,它可以正确保存屏幕截图。但是,一旦我对其进行了更改,使其开始于菜单屏幕,请选择一个曲目,“竞速”几次,将事件退出回到菜单屏幕,选择下一个曲目,依此类推,而不是获取以下内容的屏幕截图:在比赛中,即使屏幕上看不到菜单,它也会截取菜单加载屏幕的屏幕截图。

这是使用PIL的基本代码,该代码在机器人的第一个化身中起作用,但在选择该机器人的轨道中却没有作用。

image = np.array(ImageGrab.grab())
im = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_RGB2GRAY))
im.save(str(time.time()) + '.png')

然后我尝试了pyautogui,但仍然有相同的行为

image = np.array(pyautogui.screenshot())
im = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_RGB2GRAY))
im.save(str(time.time()) + '.png')

我试图模拟键盘按键来捕获屏幕截图,然后使用该屏幕截图,但我发现剪贴板中没有图像。

import pynput.keyboard as kbd
import pynput.mouse as mus

keyboard = kbd.Controller()
mouse = mus.Controller()

keyboard.press(kbd.Key.print_screen)
time.sleep(0.01)
keyboard.release(kbd.Key.print_screen)
image = np.array(ImageGrab.grabclipboard())
im = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_RGB2GRAY))
im.save(str(time.time()) + '.png')

我注意到,如果在运行过​​程中使用Alt + Tab在窗口之间移动,它将开始起作用,因此我使用win32gui.SetForegroundWindow(win32gui.FindWindow('acsw', None))使我关心的窗口与其他先前尝试过的屏幕结合在一起捕获代码,但仍然一无所获。我还单独使用了win32gui,并获得了与其他所有功能相同的结果。

hwnd = win32gui.FindWindow('acsw', None)
dataBitMap = win32ui.CreateBitmapFromHandle()
w=1920
h=1080
dataBitMap.CreateCompatibleBitmap(dcObj, w, h)
cDC.SelectObject(dataBitMap)
cDC.BitBlt((0,0),(w, h) , dcObj, (0,0), win32con.SRCCOPY)
dataBitMap.SaveBitmapFile(cDC, str(time.time())+'.bmp')
# Free Resources
dcObj.DeleteDC()
cDC.DeleteDC()
win32gui.ReleaseDC(hwnd, wDC)
win32gui.DeleteObject(dataBitMap.GetHandle())

我还尝试使用pynput单击试图捕获的窗口,以确保该窗口处于活动状态,但它也无法正常工作。

有人对如何截屏活动窗口有任何想法吗?

0 个答案:

没有答案