目录
前言
声明
前因
找python包
选择原因
代码
test_1.py
简单的代码解析
def Gethandle()
def GetClick(handle)
def doClick(cx, cy ,handle)
def runTest_1()
运行代码的一些问题
一些想法
本篇博客只是记录我的学习win32包时写下的代码
部分代码参考了这个博主的博客
python使用win32后台鼠标点击梦幻西游(只用于开学习技术)新手学习_win32模拟梦幻点击事件_weixin_47344599的博客-CSDN博客软件准备需要用到的软件PyCharm,梦幻西游手游客户端需要安装的库pip install pywin32直接上代码吧,里面都注释好了注意!!!!!需要登录到游戏账号后才能正确点击原因是登录界面需要重新抓取窗口句柄代码有些乱,但是都还好,自行优化吧能用=import win32guiimport win32conimport win32apiimport timeimpo..._win32模拟梦幻点击事件https://blog.csdn.net/weixin_47344599/article/details/105926993
自认为这位大佬写的代码有挺多区别的
但是这位博主看到了,如果觉得还是不行。联系我进行修改。
由于自己最近在玩崩铁
近几年的米家游戏都不能跳过剧情(烦~
按键精灵是个好东西,但是他必须要前台挂着(得寸进尺。。。
我想要做的是我一边挂着剧情后台自动点击,一边做其他的事情(很美好嘞
然后一如既往出了一系列问题(不然我觉得早就有人做出来了,目前就卡在这,以下是我的探索过程)
然后我就找python包
找啊找......
找到两类包
一个pyautogui包
一个就是pypiwin32包
两个包我考虑了一会
最终想试试pypiwin32包
因为我看了一下第一种包的使用教程以及例子(只是浅浅的看了一下,没有深看,如果有的话轻点喷)发现他也是类似与按键精灵的那种模拟键盘的点击
那不都差不多吗?
然后我就选择了可以后台向固定窗口发送后台点击信息的win32包
然后我就试着打了一段代码
import win32gui
import win32con
import win32api
import time
#获取句柄
def Gethandle():
time_1=5
print("五秒后,把鼠标移动到窗口处定位窗口句柄")
for i in range(1,time_1):
time.sleep(1)
print(f"还有{time_1-i}秒")
# 获取当前鼠标【x y】坐标
point = win32api.GetCursorPos()
# 通过坐标获取坐标下的【窗口句柄】
hwnd = win32gui.WindowFromPoint(point) # 请填写 x 和 y 坐标
print("获取句柄为",hwnd)
return hwnd
#开始行动
def GetClick(handle):
times = 6
if handle == 0:
for i in range(10):
print("没有获取到窗口")
else:
left, top, right, bot = win32gui.GetWindowRect(handle) # 窗口所在位置的坐标
for t in range(5):
times -= 1
print('将在倒数%d秒后点击现在的位置' % times)
tempt = win32api.GetCursorPos() # 记录鼠标所处位置的坐标
windowRec = win32gui.GetWindowRect(handle) # 目标子句柄窗口的坐标
x = tempt[0] - windowRec[0] # 计算相对x坐标
y = tempt[1] - windowRec[1] # 计算相对y坐标
print('坐标为', x, y)
time.sleep(1) # 每1s输出一次
if(x>0 and x<(right-left) and y>0 and y<(bot-top)):
doClick(x,y,handle)
print("点击完成")
print("信息如下")
print('left',left,'right',right,'top',top,'bot',bot)
elif x > 9999 and y > 9999:
for i in range(10):
print('程序不能最小化')
break
else:
for i in range(10):
print('鼠标不在界面')
break
def doClick(cx, cy ,handle): # 点击坐标
print('点击相对坐标', cx, cy, '坐标')
long_position = win32api.MAKELONG(cx, cy) # 模拟鼠标指针 传送到指定坐标
win32api.SendMessage(handle, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position) # 模拟鼠标按下
win32api.SendMessage(handle, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, long_position) # 模拟鼠标弹起
def runTest_1():
handle=Gethandle()
GetClick(handle)
runTest_1()
给大部分函数全部封装到一起,要的直接调用runTest_1()这个函数就可以了
这个函数用于获取句柄,获取方式就是通过win32api.GetCursorPos()函数获取鼠标的位置然后通过位置和win32gui.WindowFromPoint()函数来判断该窗口的句柄
进而来定位窗口
最后返回句柄
这个函数主要是通过传递handle(句柄值)来模拟点击
(这里只是最基本的点击)
同时判断窗口是否最小化,以及鼠标相较于窗口的相对位置
以及是不是在窗口里的鼠标动作
很简单的函数
传入xy的相对坐标同时模拟点击
集合在一起同时执行所有函数
这个代码十分的简单(本来想的就是先看看能不能行)
就是运行后把鼠标过5秒定位到窗口,之后过五秒自动点击鼠标的位置
然后我在QQ,微信,谷歌浏览器上运行时都发现没效果,包括pyautogui也不行
当时由于一些巧合发现了其中的问题,好像时权限不够
最后发现需要用管理员来运行pycharm就得以解决
然后QQ,微信,谷歌浏览器上面运行都可以运行
我当时特别激动
但是
游戏里面无法点击
我改了又改还是不行,估摸着应该是一些游戏屏蔽了后台通过软件发送鼠标点击事件以及键盘输入事件的命令
pyautogui应该可以,但是我还是觉得用这个不如用按键精灵省事。
马上要开学了,懒得整,过一段时间想想看看有没有法子