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ü.
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: