win32gui.GetWindowRect 获取的坐标不准
时间: 2024-02-06 22:04:12 浏览: 59
有可能是因为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参数替换为你想要获取坐标的窗口的句柄。如果你仍然发现获取的坐标不准确,可能是因为窗口本身的坐标信息不准确导致的,你可以尝试使用其他的窗口坐标获取函数来进行验证。
相关问题
win32gui.rectangle
win32gui.GetWindowRect函数用于获取窗口的位置和大小。然而,在Windows 10系统上,该函数可能会返回不正确的窗口宽度和高度。这可能是由于窗口的毛玻璃特效边框没有被正确计算导致的。
以下是一个示例代码,演示如何使用win32gui.GetWindowRect函数获取窗口的位置和大小:
```python
import win32gui
# 获取窗口句柄
hwnd = win32gui.GetForegroundWindow()
# 获取窗口的位置和大小
left, top, right, bottom = win32gui.GetWindowRect(hwnd)
# 打印窗口的位置和大小
print("窗口位置:({}, {})".format(left, top))
print("窗口大小:{} x {}".format(right - left, bottom - top))
```
请注意,这段代码只是演示了如何使用win32gui.GetWindowRect函数获取窗口的位置和大小,并没有解决在Windows 10上获取窗口宽度和高度不正确的问题。
# 获取窗口位置 left, top, right, bottom = win32gui.GetWindowRect(hwnd) # 获取窗口坐标 width = right - left height = bottom - top hwndDC = win32gui.GetWindowDC(hwnd) # 获取窗口DC mfcDC = win32ui.CreateDCFromHandle(hwndDC) saveDC = mfcDC.CreateCompatibleDC() saveBitMap = win32ui.CreateBitmap() saveBitMap.CreateCompatibleBitmap(mfcDC, width, height) 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) return bmpstr 可以优化吗
这段代码可以优化,主要是针对截图和保存图像的部分。下面是优化后的代码:
```python
import win32gui
import win32ui
import win32con
import numpy as np
def get_screenshot(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)
# 释放资源
win32gui.DeleteObject(saveBitMap.GetHandle())
saveDC.DeleteDC()
mfcDC.DeleteDC()
win32gui.ReleaseDC(hwnd, hwndDC)
# 返回截屏结果
return img
```
优化后的代码增加了释放资源的部分,并且使用更加简洁的方式来截屏和保存图像。你可以尝试使用优化后的代码,看看是否可以满足你的需求。