win32gui.GetWindowRect 获取的坐标不准
时间: 2024-02-06 17:04:12 浏览: 261
有可能是因为GetWindowRect函数获取的是窗口相对于屏幕的坐标,而不是窗口相对于父窗口的坐标。如果窗口有父窗口,那么获取到的坐标是相对于屏幕的坐标,需要通过ScreenToClient函数将其转换为相对于父窗口的坐标。以下是将窗口坐标转换为客户端坐标的示例代码:
```python
import win32gui
import win32api
hwnd = win32gui.FindWindow(None, "Window Name")
left, top, right, bottom = win32gui.GetWindowRect(hwnd)
client_x, client_y = win32gui.ScreenToClient(hwnd, (left, top))
width = right - left
height = bottom - top
print("Client coordinates: ", client_x, client_y)
print("Width: ", width)
print("Height: ", height)
```
注意要将hwnd参数替换为你想要获取坐标的窗口的句柄。如果你仍然发现获取的坐标不准确,可能是因为窗口本身的坐标信息不准确导致的,你可以尝试使用其他的窗口坐标获取函数来进行验证。
相关问题
# 获取窗口位置 left, top, right, bottom = win32gui.GetWindowRect(hwnd) width = right - left height = bottom - top # 创建DC对象 hwndDC = win32gui.GetWindowDC(hwnd) mfcDC = win32ui.CreateDCFromHandle(hwndDC) saveDC = mfcDC.CreateCompatibleDC() # 创建位图对象 saveBitMap = win32ui.CreateBitmap() saveBitMap.CreateCompatibleBitmap(mfcDC, width, height) # 将位图选入DC对象 saveDC.SelectObject(saveBitMap) # 截屏 saveDC.BitBlt((0, 0), (width, height), mfcDC, (0, 0), win32con.SRCCOPY) # 获取位图数据 bmpinfo = saveBitMap.GetInfo() bmpstr = saveBitMap.GetBitmapBits(True) # 将位图数据转换为numpy数组 img = np.frombuffer(bmpstr, dtype='uint8') img.shape = (bmpinfo['bmHeight'], bmpinfo['bmWidth'], 4) cv2.imwrite('1.bmp', img) # 释放资源 win32gui.DeleteObject(saveBitMap.GetHandle()) saveDC.DeleteDC() mfcDC.DeleteDC() win32gui.ReleaseDC(hwnd, hwndDC) # 返回截屏结果 return img 返回的结果 怎么对比
如果你要对比两张图片是否相同,可以使用OpenCV库中的`cv2.imread()`函数读取两张图片,然后使用`cv2.imshow()`函数查看它们的视觉效果,最后使用`cv2.absdiff()`函数计算两张图片的差异,并可以使用`cv2.threshold()`函数对差异图进行二值化处理,便于观察。示例代码如下:
```
import cv2
import numpy as np
# 读取两张图片
img1 = cv2.imread('1.bmp')
img2 = cv2.imread('2.bmp')
# 显示两张图片
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
# 计算两张图片的差异
diff = cv2.absdiff(img1, img2)
# 对差异图进行二值化处理
_, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)
# 显示差异图
cv2.imshow('diff', diff)
cv2.imshow('thresh', thresh)
# 等待按键
cv2.waitKey(0)
# 释放窗口
cv2.destroyAllWindows()
```
其中,`cv2.absdiff()`函数计算两张图片的差异,返回的是差异图像,即两张图片对应像素点差值的绝对值;`cv2.threshold()`函数对差异图进行二值化处理,返回的是二值化图像,即将差异图像中小于阈值的像素点设为0,大于等于阈值的像素点设为255。在这里,我们将阈值设为30。
def jietu(self,hwnd): # 获取窗口位置 left, top, right, bottom = win32gui.GetWindowRect(hwnd) width = right - left height = bottom - top # 创建DC对象 hwndDC = win32gui.GetWindowDC(hwnd) mfcDC = win32ui.CreateDCFromHandle(hwndDC) saveDC = mfcDC.CreateCompatibleDC() # 创建位图对象 saveBitMap = win32ui.CreateBitmap() saveBitMap.CreateCompatibleBitmap(mfcDC, width, height) # 将位图选入DC对象 saveDC.SelectObject(saveBitMap) # 截屏 saveDC.BitBlt((0, 0), (width, height), mfcDC, (0, 0), win32con.SRCCOPY) # 获取位图数据 bmpinfo = saveBitMap.GetInfo() bmpstr = saveBitMap.GetBitmapBits(True) # 将位图数据转换为numpy数组 img = np.frombuffer(bmpstr, dtype='uint8') img.shape = (bmpinfo['bmHeight'], bmpinfo['bmWidth'], 4) cv2.imwrite('1.bmp', img) # 释放资源 win32gui.DeleteObject(saveBitMap.GetHandle()) saveDC.DeleteDC() mfcDC.DeleteDC() win32gui.ReleaseDC(hwnd, hwndDC) # 返回截屏结果 return img 如何提取 img 部分数据
如果您要提取 img 的部分数据,可以使用 numpy 数组的切片操作来实现。例如,如果您只想获取 img 的前 100 行和前 200 列的部分数据,可以使用以下代码:
```
img_part = img[:100, :200, :]
```
其中,`img[:100, :200, :]` 表示获取 img 的前 100 行和前 200 列的所有通道的数据。您可以根据需要修改这个切片来获取不同部分的数据。
阅读全文