【问题标题】:Python windows screen capture - Continuous streaming issuePython windows屏幕截图 - 连续流问题
【发布时间】:2021-09-24 12:12:33
【问题描述】:

我正在尝试使用 pywin32 进行应用程序窗口捕获练习,以便获得窗口的确切镜像(如视频游戏)问题是 - 下面的代码继续捕获/只返回窗口的第一帧/旧帧,而不是窗口的当前帧。所以镜像中没有任何变化。我尝试更改 pywin32 不同的版本,但同样的问题。请帮忙看看代码行有什么问题

Python 版本== 3.8.10 pywin32 == 227 视窗 10

import cv2 as cv  
import numpy as np  
from time import time  
import win32gui, win32ui, win32con  

def get_screenshot(win_name):
    
    hwnd = win32gui.FindWindow(None, win_name)
    print('hwnd',hwnd)
    window_rect = win32gui.GetWindowRect(hwnd)
    print('window_rec',window_rect)
    w = window_rect[2] - window_rect[0]
    h = window_rect[3] - window_rect[1]

    wDC = win32gui.GetWindowDC(hwnd)
    print('wDC',wDC)
    dcObj = win32ui.CreateDCFromHandle(wDC)
    print('dcObj',dcObj)
    cDC = dcObj.CreateCompatibleDC()
    print('cDC',cDC)
    dataBitMap = win32ui.CreateBitmap()
    print('dataBitMap',dataBitMap)
    dataBitMap.CreateCompatibleBitmap(dcObj, w, h)
    
    cDC.SelectObject(dataBitMap)
    cDC.BitBlt((0, 0), (w, h), dcObj, (0,0), win32con.SRCCOPY)

    signedIntsArray = dataBitMap.GetBitmapBits(True)
    img = np.fromstring(signedIntsArray, dtype='uint8')

    img.shape = (h, w, 4)
    
    dcObj.DeleteDC()
    cDC.DeleteDC()
    win32gui.ReleaseDC(hwnd, wDC)
    win32gui.DeleteObject(dataBitMap.GetHandle())


    img = img[...,:3]

    return img

loop_time = time()
while(True):

    # get an updated image of the window
    frame = get_screenshot("<<Window Name>>") 
    cv.imshow('Computer Vision', frame)
    # debug the loop rate
    #print('FPS {}'.format(1 / (time() - loop_time)))
    loop_time = time()

    # press 'q' with the output window focused to exit.
    # waits 1 ms every loop to process key presses
    if cv.waitKey(1) == ord('q'):
        cv.destroyAllWindows()
        break

【问题讨论】:

    标签: python window pywin32 screen-capture


    【解决方案1】:

    按照相同的在线教程,我遇到了同样的问题。他在第 5 个视频中讨论了这个问题。看这里:https://www.youtube.com/watch?v=7k4j-uL8WSQ&list=PL1m2M8LQlzfKtkKq2lK5xko4X-8EZzFPI&index=5

    代替:

    hwnd = win32gui.FindWindow()
    

    使用:

    hwnd = win32gui.GetDesktopWindow()
    

    不幸的是,它有捕获整个桌面窗口的副作用,但功能仍然很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多