下面这段代码按理来说应该没有任何问题。
就是在A点按下鼠标左键,移动到B点放开鼠标。
然而问题还是出现了,下面有运行结果。
import win32api,win32gui,win32con
# win32gui.FindWindow(类名,标题) 获取父级窗口句柄
Hand1 = win32gui.FindWindow('LDPlayerMainFrame','雷电模拟器(64)')
print(Hand1)
# win32gui.FindWindowEx(父级窗口句柄,None,类名,标题) 获取子级窗口句柄
Hand2 = win32gui.FindWindowEx(Hand1,None,'RenderWindow', 'TheRender')
print(Hand2)
def Move(X1,Y1,X2,Y2):
temp = win32api.MAKELONG(X1,Y1)
win32api.SendMessage(Hand2, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, temp) # 鼠标按下
temp1 = win32api.MAKELONG(X2,Y2)
win32api.SendMessage(Hand2, win32con.WM_MOUSEMOVE, win32con.MK_LBUTTON, temp1) # 鼠标移动
win32api.SendMessage(Hand2, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, temp1) # 鼠标弹起
Move(1832,1002,942,574)
按照下面的运行结果来看,上面的代码并没有被正确的执行。
如果只是一组坐标的点击,并不会有任何问题。
然而只要加入第二组移动坐标,以下的问题就会出现。
昨天研究了一整天,试了各种方法,试图让坐标被正确读取,甚至想着它是不是把窗口分成了四等份,说起来都是泪。
下面是最后找到的解决方法。
我们再来看上面这张图,距离目标点是不是有着一倍的差距。
没错,这就是最后的解决方法,好蠢 ╮( ̄▽ ̄)╭
所以坐标只需要重新计算一下即可。
X2 = X2 - (X1 - X2)
Y2 = Y2 - (Y1 - Y2)
下面来看看最后的运行结果
import win32api,win32gui,win32con,time
# win32gui.FindWindow(类名,标题) 获取父级窗口句柄
Hand1 = win32gui.FindWindow('LDPlayerMainFrame','雷电模拟器(64)')
print(Hand1)
# win32gui.FindWindowEx(父级窗口句柄,None,类名,标题) 获取子级窗口句柄
Hand2 = win32gui.FindWindowEx(Hand1,None,'RenderWindow', 'TheRender')
print(Hand2)
def Move(X1,Y1,X2,Y2):
temp = win32api.MAKELONG(X1,Y1)
win32api.SendMessage(Hand2, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, temp) # 鼠标按下
# 坐标的重新计算
X2 = X2 - (X1 - X2)
Y2 = Y2 - (Y1 - Y2)
temp1 = win32api.MAKELONG(X2,Y2)
win32api.SendMessage(Hand2, win32con.WM_MOUSEMOVE, win32con.MK_LBUTTON, temp1) # 鼠标移动
win32api.SendMessage(Hand2, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, temp1) # 鼠标弹起
Move(1832,1002,942,574)
运行正确
大家也可以拿去试试,虽然过程很蠢,但是问题总算解决了。