Pywin32 Chrome boyutunu ayarlama

ayalkin

Hectopat
Katılım
6 Mayıs 2020
Mesajlar
171
Çözümler
1
Merhaba arkadaşlar. Bu kod sayesinde Chrome uygulamasını ön plana alıp onun boyutunu değiştirmek istiyorum veya birkaç uygulama üstünde geçiş yapmam gerekebilir. Maalesef ki uygulamanın pencere ismini yazmama rağmen erişemiyorum. Kullandığım işletim sistemi ile alakalı olabilir mi? Öncesinde Windows 7'de kullanıyordum. Normalde bu kodu başka bir uygulamamın içinde sorunsuz kullanıyorum. Kodu normalde başka bir forumda paylaşmışlardı ben üstüne eklemeler yapıp bazı kısımları ile oynadım. Neden Selenium kullanmıyorsun diye soran olursa projeden çok uzakta kalıyor.

Gecenin bu kör vaktinde neyi gözden kaçırdığımı bulamadım bir türlü.

Python:
import time
import numpy as np
import win32gui, win32ui, win32con



# YARARLANDIGIM KAYNAKLAR
# https://github.com/learncodebygaming/opencv_tutorials/blob/master/009_bot/windowcapture.py


class WindowCapture:
   
    # properties
    w = 0
    h = 0
    hwnd = None
    cropped_x = 0
    cropped_y = 0
    offset_x = 0
    offset_y = 0
    tek = 0
    w1 = 0
    h1 = 0
   
    # constructor
    def __init__(self, window_name=None ,x=0, y=0, w1=640, h1=360 ):
        # find the handle for the window we want to capture.
        # if no window name is given, capture the entire screen
        if window_name is None:
            self.hwnd = win32gui.GetDesktopWindow()
        else:
            self.hwnd = win32gui.FindWindow(None, window_name)
            if not self.hwnd:
                raise Exception('Window not found: {}'.format(window_name))
       
        # Window move and size
        if self.tek == 0:
            self.tek = 1
            if window_name is None:
                pass
            else:  
                win32gui.MoveWindow(self.hwnd, x, y, w1, h1, True) #640, 360
                self.w = w1
                self.h = h1
                self.w1 = w1
                self.h1 = h1
       
    def get_screenshot(self, sc_position=0):
        ########################################
        if sc_position == 0:
            # get the window size
            window_rect = win32gui.GetWindowRect(self.hwnd)
            self.w = window_rect[2] - window_rect[0]
            self.h = window_rect[3] - window_rect[1]

            # account for the window border and titlebar and cut them off
            border_pixels = 8
            titlebar_pixels = 30
            self.w = self.w - (border_pixels * 2)
            self.h = self.h - titlebar_pixels - border_pixels
            self.cropped_x = border_pixels
            self.cropped_y = titlebar_pixels

            # set the cropped coordinates offset so we can translate screenshot
            # images into actual screen positions
            self.offset_x = window_rect[0] + self.cropped_x
            self.offset_y = window_rect[1] + self.cropped_y  
       
        elif sc_position == 1:    
            # get the window size
            self.rec = window_rect = win32gui.GetWindowRect(self.hwnd)
            self.w = window_rect[2] - window_rect[0]
            self.h = window_rect[3] - window_rect[1]

            # account for the window border and titlebar and cut them off
            border_pixels = 8
            titlebar_pixels = 30
            self.w = self.w - border_pixels - int(self.w1 / 2)
            self.h = self.h - titlebar_pixels - border_pixels
            self.cropped_x = border_pixels
            self.cropped_y = titlebar_pixels

            # set the cropped coordinates offset so we can translate screenshot
            # images into actual screen positions
            self.offset_x = window_rect[0] + self.cropped_x
            self.offset_y = window_rect[1] + self.cropped_y
           
        elif sc_position == 2:
            # get the window size
            window_rect = win32gui.GetWindowRect(self.hwnd)
            self.w = window_rect[2] - window_rect[0]
            self.h = window_rect[3] - window_rect[1]

            # account for the window border and titlebar and cut them off
            border_pixels = 8
            titlebar_pixels = 30
            self.w = self.w - border_pixels - int(self.w1 / 2)
            self.h = self.h - titlebar_pixels - border_pixels
            self.cropped_x = int(self.w1 / 2)
            self.cropped_y = titlebar_pixels

            # set the cropped coordinates offset so we can translate screenshot
            # images into actual screen positions
            self.offset_x = window_rect[0] + self.cropped_x
            self.offset_y = window_rect[1] + self.cropped_y
        ########################################
        # get the window image data
        wDC = win32gui.GetWindowDC(self.hwnd)
        dcObj = win32ui.CreateDCFromHandle(wDC)
        cDC = dcObj.CreateCompatibleDC()
        dataBitMap = win32ui.CreateBitmap()
        dataBitMap.CreateCompatibleBitmap(dcObj, self.w, self.h)
        cDC.SelectObject(dataBitMap)
        cDC.BitBlt((0, 0), (self.w, self.h), dcObj, (self.cropped_x, self.cropped_y), win32con.SRCCOPY)

        # convert the raw data into a format opencv can read
        #dataBitMap.SaveBitmapFile(cDC, 'debug.bmp')
        signedIntsArray = dataBitMap.GetBitmapBits(True)
        img = np.fromstring(signedIntsArray, dtype='uint8')
        img.shape = (self.h, self.w, 4)

        # free resources
        dcObj.DeleteDC()
        cDC.DeleteDC()
        win32gui.ReleaseDC(self.hwnd, wDC)
        win32gui.DeleteObject(dataBitMap.GetHandle())

        # drop the alpha channel, or cv.matchTemplate() will throw an error like:
        #   error: (-215:Assertion failed) (depth == CV_8U || depth == CV_32F) && type == _templ.type()
        #   && _img.dims() <= 2 in function 'cv::matchTemplate'
        img = img[...,:3]

        # make image C_CONTIGUOUS to avoid errors that look like:
        #   File ... in draw_rectangles
        #   TypeError: an integer is required (got type tuple)
        # see the discussion here:
        # https://github.com/opencv/opencv/issues/14866#issuecomment-580207109
        img = np.ascontiguousarray(img)
        return img

    # find the name of the window you're interested in.
    # once you have it, update window_capture()
    # https://stackoverflow.com/questions/55547940/how-to-get-a-list-of-the-name-of-every-open-window
    @staticmethod
    def list_window_names():
        def winEnumHandler(hwnd, ctx):
            if win32gui.IsWindowVisible(hwnd):
                print(hex(hwnd), win32gui.GetWindowText(hwnd))
        win32gui.EnumWindows(winEnumHandler, None)

    # translate a pixel position on a screenshot image to a pixel position on the screen.
    # pos = (x, y)
    # WARNING: if you move the window being captured after execution is started, this will
    # return incorrect coordinates, because the window position is only calculated in
    # the __init__ constructor.
    def get_screen_position(self, x, y):
        return (x + self.offset_x, y + self.offset_y)
 
Son düzenleyen: Moderatör:

Bu konuyu görüntüleyen kullanıcılar

Technopat Haberler

Yeni konular

Geri
Yukarı