pywin32 实现的鼠标后台点击功能略有不足

239 天前
 lon91ong

主要参考, 使用 pywin32 的 SendMessage 函数实现,函数定义如下:

from win32.win32gui import SendMessage
# 定义鼠标事件的参数
MK_LBUTTON = 1 # 鼠标左键, 右键为 2
MOUSE_MOVE = 512 #0x0001  # 鼠标移动
MOUSE_LEFTDOWN = 513 #0x0002  # 左键按下
MOUSE_LEFTUP = 514 #0x0004  # 左键释放
def bkg_click(hWnd, coord, count = 1, drag = False, delta = 0):
	# hWnd 窗口句柄,coord 相对坐标,drag 拖动与否,delta 拖动量,count 点击次数
	x, y = int(coord[0]), int(coord[1])
	while count > 0:
		lParam = x | y <<16
		SendMessage(hWnd, MOUSE_LEFTDOWN, MK_LBUTTON, lParam)
		if drag:
			lParam = x | (y + delta) <<16
			SendMessage(hWnd,MOUSE_MOVE, MK_LBUTTON, lParam)
		SendMessage(hWnd, MOUSE_LEFTUP, None, lParam)
		sleep(0.3)
		count -= 1

美中不足之处在于,点击事件发送时会激活窗口,会抢夺活动窗口权限,影响电脑的其它操作

请教大侠有没有更完美的 后台 鼠标事件发送方法

1312 次点击
所在节点    Python
17 条回复
zictos
239 天前
大漠插件
kkk9
239 天前
调用驱动后台
ysc3839
239 天前
PostMessage 呢? LockSetForegroundWindow 呢?
GeekGao
239 天前
PostMessage
owen800q
239 天前
用大漠插件
lon91ong
239 天前
根据上面几位的回复进行了一番搜索,结果如下:

> 大漠插件限制 32 为 python ,我的 python 环境迁移到 64 位平台已经很久了,不想再折腾回去

> PostMessage 试过了,直接替换 SendMessage 函数,其它都不变,然后鼠标乱点,似乎坐标错乱了,不明白跟 SendMessage 的坐标换算有啥不兼容的地方

> LockSetForegroundWindow 根据[微软的介绍]( https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-locksetforegroundwindow)是给前台程序用的,跟我这个要求不符
ohmyhaha
239 天前
我插个眼。蹲一个方案
lon91ong
239 天前
更新一下反馈信息,上面关于 PostMessage 替换 SendMessage 的反馈有误,用 PostMessage 替换后程序表现不是坐标错乱,而是跟 SendMessage 一样会抢活动窗口权限

另外补充一点,用两个脚本进程分别监控两个窗口,只有一个进程会抢活动窗口权限,另外一个不抢,同样的代码,好奇怪
lon91ong
239 天前
再补充一点,没有使用多线程,就是直接打开了两个命令行窗口,分别运行两个脚本实例,一个抢一个不抢
zaw
239 天前
以前也研究过,太麻烦了,最后还是选大漠插件,虽然只能 32 位 python ,但影响不大,电脑上多版本 python 外加 env 独立环境
lon91ong
237 天前
今天为了测试兼容性把代码复制了一份整了两个文件夹( 3.10 和 3.11 各一个),脚本分开跑之后不抢窗口焦点了
用的是 PostMessage 方法
lon91ong
236 天前
一切都是幻觉,今天又抢焦点了
lon91ong
233 天前
用多进程(multiprocessing)解决了
很奇怪的毛病,开两个命令行窗口分别运行就会有一个抢焦点,同样的代码用 multiprocessing 就不抢了
lon91ong
233 天前
然并卵,就昨天一会儿好用,今天重开依旧是一个抢一个不抢

控制变量,折腾了半天,现在不抢了,还是一头雾水
lon91ong
233 天前
lon91ong
29 天前
https://bbs.125.la/thread-14804647-2-1.html
问题归结于浏览器窗口的问题,小程序也是 Chrome 核心的,凡是 Chrome 核心的都不行
换用 Firefox 就可以完全后台了
lon91ong
28 天前
还有用 Python 服务油猴 js 提供键鼠输入的思路,在吾爱破解那边,1734053

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/973131

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX